/** * DiffViewerTool 单元测试(P1-14 测试基线) * 覆盖:LCS diff 计算(text 模式,不触文件系统) */ import { describe, it, expect, vi } from 'vitest'; vi.mock('electron-log', () => ({ default: { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }, })); import { DiffViewerTool } from '../diff-viewer'; import type { ToolExecutionContext } from '../../../types/metona-tool'; const context: ToolExecutionContext = { sessionId: 'test', workspacePath: process.cwd(), iteration: 1, requestId: 'req_test', }; interface DiffResult { success: boolean; error?: string; diff?: string; summary?: { lines_added: number; lines_removed: number; total_changes: number; similarity: number }; } describe('DiffViewerTool(text 模式)', () => { const tool = new DiffViewerTool(); it('两段文本生成统一 diff(成功)', async () => { const result = await tool.execute( { mode: 'text', text_a: 'line1\nline2\nline3', text_b: 'line1\nline2-changed\nline3' }, context, ) as DiffResult; expect(result.success).toBe(true); expect(result.diff).toContain('-line2'); expect(result.diff).toContain('+line2-changed'); expect(result.summary?.total_changes).toBe(2); }); it('相同文本返回无差异', async () => { const result = await tool.execute( { mode: 'text', text_a: 'same\nsame', text_b: 'same\nsame' }, context, ) as DiffResult; expect(result.success).toBe(true); expect(result.summary?.total_changes).toBe(0); expect(result.summary?.similarity).toBe(1); }); it('无效 mode 返回错误', async () => { const result = await tool.execute({ mode: 'invalid' }, context) as DiffResult; expect(result.success).toBe(false); expect(result.error).toContain('Invalid mode'); }); it('插入与删除均正确计算', async () => { const result = await tool.execute( { mode: 'text', text_a: 'a\nb\nc', text_b: 'a\nx\nb\nc\nd' }, context, ) as DiffResult; expect(result.success).toBe(true); expect(result.diff).toContain('+x'); expect(result.diff).toContain('+d'); expect(result.summary?.lines_added).toBe(2); }); });