import { describe, it, expect } from 'vitest'; import { computeCodeQuality } from '../services/code-quality'; const mk = (path: string, content: string) => ({ path, content }); describe('TC-QUALITY · 代码质量确定性评估(2026-08-27)', () => { it('真实实现(大量逻辑、无占位)→ 质量分高', () => { const files = [ mk('src/core.py', [ 'def process(data):', ' result = []', ' for item in data:', ' if item["ok"]:', ' result.append(item["value"] * 2)', ' else:', ' result.append(0)', ' return result', '', 'def analyze(x):', ' return {"count": len(x), "total": sum(x)}', ].join('\n')), mk('tests/test_core.py', [ 'def test_process():', ' assert process([{"ok": True, "value": 3}]) == [6]', 'def test_analyze():', ' assert analyze([1,2,3]) == {"count": 3, "total": 6}', ].join('\n')), ]; const r = computeCodeQuality(files); expect(r.applicable).toBe(true); expect(r.stubRatio).toBe(0); // 无空壳 expect(r.qualityScore).toBeGreaterThanOrEqual(60); expect(r.testValidityRatio).toBe(0.5); // 2断言/2测试函数 = 0.5 }); it('空壳函数多(pass/占位)→ 空壳率升高、质量分低', () => { const files = [ mk('src/core.py', [ 'def a():', ' pass', 'def b():', ' pass', 'def c():', ' pass', 'def real():', ' return 42', ].join('\n')), ]; const r = computeCodeQuality(files); expect(r.applicable).toBe(true); expect(r.stubRatio).toBeGreaterThan(0.5); // 3/4 空壳 expect(r.qualityScore).toBeLessThan(40); }); it('重复代码多 → 重复率升高', () => { const dupBlock = [ ' result = []', ' for item in items:', ' if item["ok"] and item["val"] > threshold:', ' result.append(item["val"] * 2 + offset - tax_rate)', ' else:', ' result.append(0)', ' return result', ].join('\n'); const files = []; for (let i = 0; i < 5; i++) { files.push(mk(`src/mod${i}.py`, `def f${i}(items, offset, tax_rate, threshold):\n${dupBlock}\n`)); } const r = computeCodeQuality(files); expect(r.applicable).toBe(true); expect(r.dupRatio).toBeGreaterThan(0.5); }); it('测试只测边角料(无断言)→ 测试有效度低', () => { const files = [ mk('src/core.py', 'def real(x):\n return x * 2\n'), mk('tests/test_core.py', [ 'def test_placeholder():', ' pass', 'def test_other():', ' return', ].join('\n')), ]; const r = computeCodeQuality(files); expect(r.applicable).toBe(true); expect(r.testValidityRatio).toBe(0); // 无断言 }); it('无源码文件 → 不适用', () => { const r = computeCodeQuality([mk('README.md', '# doc')]); expect(r.applicable).toBe(false); }); it('toPrompt 含三项指标', () => { const r = computeCodeQuality([mk('src/a.py', 'def x():\n return 1\n')]); expect(r.toPrompt).toContain('空壳率'); expect(r.toPrompt).toContain('重复率'); expect(r.toPrompt).toContain('测试有效度'); expect(r.toPrompt).toContain('确定性证据'); }); });