- src/test 迁移至根目录 tests/(16 测试 + fixtures/manual),导入改为 ../src/ - 新增 tsconfig.test.json 独立编译测试;.vscode-test.mjs / package.json / .gitignore 同步 - 新增 tests/test-execution-log.md、tests/test-cases.md(116 用例清单) - 新增 tests/measure/measure-review-time.mjs + performance-comparison.md(提效测量) - 重命名 3 个中文报告文件为 demo-*-coverage-report.md - git rm --cached 解除 vsix 跟踪;README 标注演示视频进行中
146 lines
5.6 KiB
TypeScript
146 lines
5.6 KiB
TypeScript
import * as assert from 'assert';
|
|
import { filterForDocument, filterAndSummarize } from '../src/rules/rule-filter';
|
|
import type { CustomRule } from '../src/types';
|
|
|
|
function mockDoc(languageId: string, fileName: string): { languageId: string; fileName: string } {
|
|
return { languageId, fileName };
|
|
}
|
|
|
|
const baseRules: CustomRule[] = [
|
|
{ id: 'java-rule', severity: 'error', description: '', message: '', languages: ['java'] },
|
|
{ id: 'js-rule', severity: 'error', description: '', message: '', languages: ['javascript'] },
|
|
{ id: 'ts-rule', severity: 'error', description: '', message: '', languages: ['typescript'] },
|
|
{ id: 'css-rule', severity: 'error', description: '', message: '', languages: ['css'] },
|
|
{ id: 'universal', severity: 'warning', description: '', message: '' },
|
|
{ id: 'no-css', severity: 'info', description: '', message: '', excludeLanguages: ['css'] },
|
|
{ id: 'empty-langs', severity: 'info', description: '', message: '', languages: [] },
|
|
];
|
|
|
|
suite('Rule Filter Tests', () => {
|
|
|
|
test('白名单命中', () => {
|
|
const doc = mockDoc('java', '/test/Foo.java');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('java-rule'));
|
|
assert.ok(ids.includes('universal'));
|
|
});
|
|
|
|
test('白名单未命中', () => {
|
|
const doc = mockDoc('java', '/test/Foo.java');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(!ids.includes('js-rule'));
|
|
assert.ok(!ids.includes('css-rule'));
|
|
});
|
|
|
|
test('白名单为空→全语言保留', () => {
|
|
const doc = mockDoc('css', '/test/test.css');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('universal'));
|
|
assert.ok(ids.includes('empty-langs'));
|
|
});
|
|
|
|
test('白名单缺失→全语言保留', () => {
|
|
const doc = mockDoc('css', '/test/test.css');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('universal'));
|
|
});
|
|
|
|
test('黑名单命中→剔除', () => {
|
|
const doc = mockDoc('css', '/test/test.css');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(!ids.includes('no-css'));
|
|
});
|
|
|
|
test('黑名单未命中→保留', () => {
|
|
const doc = mockDoc('java', '/test/Foo.java');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('no-css'));
|
|
});
|
|
|
|
test('黑名单为空→保留', () => {
|
|
const rules: CustomRule[] = [
|
|
{ id: 'r1', severity: 'info', description: '', message: '', excludeLanguages: [] },
|
|
];
|
|
const doc = mockDoc('css', '/test/test.css');
|
|
const result = filterForDocument(rules, doc as any);
|
|
assert.strictEqual(result.length, 1);
|
|
});
|
|
|
|
test('白名单+黑名单交集→黑名单胜出剔除', () => {
|
|
const rules: CustomRule[] = [
|
|
{ id: 'r1', severity: 'info', description: '', message: '', languages: ['java'], excludeLanguages: ['java'] },
|
|
];
|
|
const doc = mockDoc('java', '/test/Foo.java');
|
|
const result = filterForDocument(rules, doc as any);
|
|
assert.strictEqual(result.length, 0);
|
|
});
|
|
|
|
test('typescriptreact 别名→命中 typescript 规则', () => {
|
|
const doc = mockDoc('typescriptreact', '/test/App.tsx');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('ts-rule'));
|
|
});
|
|
|
|
test('plsql 同组→命中 sql 规则', () => {
|
|
const rules: CustomRule[] = [
|
|
{ id: 'sql-rule', severity: 'error', description: '', message: '', languages: ['sql'] },
|
|
{ id: 'plsql-rule', severity: 'error', description: '', message: '', languages: ['plsql'] },
|
|
];
|
|
const doc = mockDoc('plsql', '/test/test.plsql');
|
|
const result = filterForDocument(rules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('sql-rule'));
|
|
assert.ok(ids.includes('plsql-rule'));
|
|
});
|
|
|
|
test('JSP 并集→保留 java 规则', () => {
|
|
const doc = mockDoc('html', '/test/test.jsp');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('java-rule'));
|
|
assert.ok(ids.includes('js-rule'));
|
|
assert.ok(ids.includes('ts-rule'));
|
|
assert.ok(ids.includes('css-rule'));
|
|
});
|
|
|
|
test('JSP 并集→保留 css 规则', () => {
|
|
const doc = mockDoc('html', '/test/test.jspx');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(ids.includes('css-rule'));
|
|
});
|
|
|
|
test('普通HTML不触发JSP→剔除java规则', () => {
|
|
const doc = mockDoc('html', '/test/index.html');
|
|
const result = filterForDocument(baseRules, doc as any);
|
|
const ids = result.map(r => r.id);
|
|
assert.ok(!ids.includes('java-rule'));
|
|
});
|
|
|
|
test('全部过滤→skippedRequestA=true', () => {
|
|
const rules: CustomRule[] = [
|
|
{ id: 'java-rule', severity: 'error', description: '', message: '', languages: ['java'] },
|
|
];
|
|
const doc = mockDoc('css', '/test/test.css');
|
|
const result = filterAndSummarize(rules, doc as any);
|
|
assert.strictEqual(result.relevant.length, 0);
|
|
assert.strictEqual(result.filteredOut.length, 1);
|
|
assert.strictEqual(result.skippedRequestA, true);
|
|
});
|
|
|
|
test('部分过滤→skippedRequestA=false', () => {
|
|
const doc = mockDoc('java', '/test/Foo.java');
|
|
const result = filterAndSummarize(baseRules, doc as any);
|
|
assert.ok(result.relevant.length > 0);
|
|
assert.ok(result.filteredOut.length > 0);
|
|
assert.strictEqual(result.skippedRequestA, false);
|
|
});
|
|
});
|