import * as assert from 'assert'; import { setLanguage, getLanguage } from '../src/i18n/messages'; import { buildFixSystemPrompt, buildFixUserPrompt, buildFixContext, buildVerifySystemPrompt, buildVerifyUserPrompt, } from '../src/fix/fixPrompt'; suite('FixPrompt Tests', () => { let orig: string; setup(() => { orig = getLanguage(); }); teardown(() => { setLanguage(orig as 'zh-CN' | 'en' | 'ja'); }); test('buildFixSystemPrompt defaults to Chinese', () => { setLanguage('zh-CN'); assert.match(buildFixSystemPrompt(), /资深代码修复专家/); }); test('buildFixSystemPrompt returns English variant', () => { setLanguage('en'); assert.match(buildFixSystemPrompt(), /senior code fixer/i); }); test('buildFixSystemPrompt returns Japanese variant', () => { setLanguage('ja'); assert.match(buildFixSystemPrompt(), /シニア/); }); test('buildFixUserPrompt includes issue, message and context', () => { const prompt = buildFixUserPrompt( { ruleId: 'eslint:eqeqeq', line: 3, message: 'Use ===' }, '1| var a = b == c;' ); assert.match(prompt, /eslint:eqeqeq/); assert.match(prompt, /Use ===/); assert.match(prompt, /var a = b == c;/); }); test('buildFixUserPrompt includes suggestion when present', () => { const prompt = buildFixUserPrompt( { ruleId: 'r', line: 1, message: 'm', suggestion: 'use let' }, 'ctx' ); assert.match(prompt, /use let/); }); test('buildFixUserPrompt omits suggestion when blank', () => { setLanguage('zh-CN'); const prompt = buildFixUserPrompt( { ruleId: 'r', line: 1, message: 'm', suggestion: ' ' }, 'ctx' ); assert.ok(!prompt.includes('参考建议')); }); test('buildFixContext windows around line with padding', () => { const code = Array.from({ length: 20 }, (_, i) => `line-${i + 1}`).join('\n'); const ctx = buildFixContext(code, 10); const lines = ctx.split('\n'); assert.ok(lines.length >= 13); assert.match(lines[0], /^\s+5\| line-5/); assert.match(lines[lines.length - 1], /line-17/); }); test('buildFixContext clamps at document boundaries', () => { const ctx = buildFixContext('a\nb\nc\n', 0); const lines = ctx.split('\n'); assert.match(lines[0], /1\| a/); assert.match(ctx, /3\| c/); }); test('buildVerifySystemPrompt has language variants', () => { setLanguage('zh-CN'); assert.match(buildVerifySystemPrompt(), /代码审查员/); setLanguage('en'); assert.match(buildVerifySystemPrompt(), /code reviewer/i); setLanguage('ja'); assert.match(buildVerifySystemPrompt(), /レビュアー/); }); test('buildVerifyUserPrompt includes issue and code', () => { const prompt = buildVerifyUserPrompt({ ruleId: 'r', line: 0, message: 'no-var' }, 'var x = 1;'); assert.match(prompt, /no-var/); assert.match(prompt, /var x = 1;/); }); });