397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.6 KiB
JavaScript
34 lines
1.6 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { DEFAULT_EXPLORATION, tallyUsage, proposeProbe } from './router-exploration.mjs';
|
|
|
|
describe('DEFAULT_EXPLORATION (по умолчанию ВЫКЛючена)', () => {
|
|
it('rate = 0', () => { expect(DEFAULT_EXPLORATION.rate).toBe(0); });
|
|
});
|
|
|
|
describe('tallyUsage (счётчик использования узлов)', () => {
|
|
it('инкремент по узлу', () => {
|
|
const c = tallyUsage(tallyUsage({}, '#a'), '#a');
|
|
expect(c['#a']).toBe(2);
|
|
});
|
|
});
|
|
|
|
describe('proposeProbe (#3 — проба = ВОПРОС владельцу, не авто)', () => {
|
|
const cands = [{ id: '#a' }, { id: '#b' }, { id: '#c' }];
|
|
const usage = { '#a': 100, '#b': 100, '#c': 1 };
|
|
it('rate=0 → нет пробы (анти-самоослепление выключено по умолчанию)', () => {
|
|
expect(proposeProbe({ rate: 0, usageCounts: usage, candidates: cands })).toBe(null);
|
|
});
|
|
it('rate>0 → предлагает наименее использованный, requiresOwnerApproval', () => {
|
|
const p = proposeProbe({ rate: 0.2, usageCounts: usage, candidates: cands });
|
|
expect(p.probe).toBe('#c');
|
|
expect(p.requiresOwnerApproval).toBe(true);
|
|
expect(typeof p.justification).toBe('string');
|
|
expect(typeof p.risk).toBe('string');
|
|
});
|
|
it('риск-гард: высокорисковый узел не предлагается к пробе', () => {
|
|
const riskOf = (id) => id === '#c';
|
|
const p = proposeProbe({ rate: 0.2, usageCounts: usage, candidates: cands, riskOf });
|
|
expect(p === null || p.probe !== '#c').toBe(true);
|
|
});
|
|
});
|