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); }); });