mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-10-03 02:21:44 +00:00
Some checks are pending
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Gitleaks / gitleaks (push) Waiting to run
Publish / Classify release event (push) Waiting to run
Publish / RC guard (marker + release-PR skip) (push) Blocked by required conditions
Publish / ci (push) Blocked by required conditions
Publish / Publish to npm (push) Blocked by required conditions
Publish / Build & Push RC Docker images (push) Blocked by required conditions
Scorecard / Scorecard analysis (push) Waiting to run
Trivy Image Scan / Trivy (gitnexus-cli) (push) Waiting to run
Trivy Image Scan / Trivy (gitnexus-web) (push) Waiting to run
132 lines
3.7 KiB
TypeScript
132 lines
3.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import {
|
|
compareSymbolSets,
|
|
evaluateCheckGates,
|
|
median,
|
|
percentile,
|
|
summarizeCases,
|
|
symbolKeysFromByDepth,
|
|
} from '../../bench/impact-pdg/real-code.mjs';
|
|
|
|
describe('impact-pdg real-code metric helpers', () => {
|
|
it('extracts stable symbol keys from byDepth records', () => {
|
|
const keys = symbolKeysFromByDepth({
|
|
1: [
|
|
{ id: 'Function:src/a.ts:a', name: 'a', filePath: 'src/a.ts' },
|
|
{ id: null, name: 'dynamicTarget', filePath: 'src/b.ts' },
|
|
],
|
|
});
|
|
|
|
expect([...keys].sort()).toEqual(['Function:src/a.ts:a', 'dynamicTarget@src/b.ts']);
|
|
});
|
|
|
|
it('compares candidate symbol reach against a reference set', () => {
|
|
const comparison = compareSymbolSets(new Set(['A', 'B']), new Set(['A', 'C']));
|
|
|
|
expect(comparison).toMatchObject({
|
|
referenceSize: 2,
|
|
candidateSize: 2,
|
|
overlapSize: 1,
|
|
recallVsReference: 0.5,
|
|
precisionVsReference: 0.5,
|
|
jaccard: 1 / 3,
|
|
referenceOnly: ['B'],
|
|
candidateOnly: ['C'],
|
|
});
|
|
});
|
|
|
|
it('summarizes latency and quality proxy metrics across cases', () => {
|
|
const summary = summarizeCases([
|
|
{
|
|
latencyMs: {
|
|
callgraph: { median: 10 },
|
|
pdg: { median: 25, p95: 30 },
|
|
pdgOverCallgraphMedian: 2.5,
|
|
},
|
|
callgraph: { error: null, partial: false },
|
|
pdg: {
|
|
error: null,
|
|
pdgLayer: 'ready',
|
|
partial: false,
|
|
epistemic: 'pdg-intra-procedural',
|
|
evidenceCounts: { 'callgraph-bridge': 2 },
|
|
},
|
|
symbolAgreement: {
|
|
recallVsReference: 1,
|
|
precisionVsReference: 1,
|
|
},
|
|
},
|
|
{
|
|
latencyMs: {
|
|
callgraph: { median: 20 },
|
|
pdg: { median: 40, p95: 45 },
|
|
pdgOverCallgraphMedian: 2,
|
|
},
|
|
callgraph: { error: null, partial: false },
|
|
pdg: {
|
|
error: null,
|
|
pdgLayer: 'ready',
|
|
partial: true,
|
|
epistemic: 'pdg-intra-procedural',
|
|
evidenceCounts: { 'unproven-bridge': 1 },
|
|
},
|
|
symbolAgreement: {
|
|
recallVsReference: 0.5,
|
|
precisionVsReference: 1,
|
|
},
|
|
},
|
|
] as any);
|
|
|
|
expect(summary.performance).toMatchObject({
|
|
callgraphMedianMs: 15,
|
|
pdgMedianMs: 32.5,
|
|
pdgP95Ms: 45,
|
|
pdgOverCallgraphMedian: 2.25,
|
|
});
|
|
expect(summary.qualityProxy).toMatchObject({
|
|
comparableCases: 2,
|
|
meanSymbolRecallVsCallgraph: 0.75,
|
|
minSymbolRecallVsCallgraph: 0.5,
|
|
meanSymbolPrecisionVsCallgraph: 1,
|
|
degradedCaseCount: 0,
|
|
errorCaseCount: 0,
|
|
partialCaseCount: 1,
|
|
evidenceCounts: { 'callgraph-bridge': 2, 'unproven-bridge': 1 },
|
|
unprovenBridgeRatio: 0.333,
|
|
});
|
|
});
|
|
|
|
it('reports explicit check failures for degraded quality and slow PDG medians', () => {
|
|
const failures = evaluateCheckGates(
|
|
{
|
|
cases: [{}],
|
|
summary: {
|
|
performance: { pdgMedianMs: 600 },
|
|
qualityProxy: {
|
|
errorCaseCount: 1,
|
|
degradedCaseCount: 1,
|
|
minSymbolRecallVsCallgraph: 0.5,
|
|
},
|
|
},
|
|
} as any,
|
|
{
|
|
GN_REAL_CODE_PDG_MIN_SYMBOL_RECALL: '0.9',
|
|
GN_REAL_CODE_PDG_MAX_MEDIAN_MS: '500',
|
|
} as any,
|
|
);
|
|
|
|
expect(failures).toEqual([
|
|
'1 case(s) returned errors',
|
|
'1 case(s) reported a degraded PDG layer',
|
|
'min PDG symbol recall vs callgraph 0.5 < 0.9',
|
|
'PDG median latency 600ms > 500ms',
|
|
]);
|
|
});
|
|
|
|
it('computes median and percentile deterministically', () => {
|
|
expect(median([9, 1, 3])).toBe(3);
|
|
expect(median([9, 1, 3, 5])).toBe(4);
|
|
expect(percentile([10, 30, 20], 95)).toBe(30);
|
|
});
|
|
});
|