Files
brain/tools/conversation-cadence.test.mjs
T

40 lines
2.0 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { CADENCE, checksForEvent, oversizeSignal } from './conversation-cadence.mjs';
describe('checksForEvent (§3 — какие проверки когда)', () => {
it('на каждый ответ — лёгкий проход всплывшей нужды + полнота', () => {
expect(checksForEvent('answer')).toEqual(['emerge-light', 'coverage']);
});
it('при пересборке плана — полная верность + полнота', () => {
expect(checksForEvent('replan')).toEqual(['verity-full', 'coverage']);
});
it('неизвестное событие → []', () => {
expect(checksForEvent('xyz')).toEqual([]);
});
it('CADENCE заморожен (нельзя мутировать политику)', () => {
expect(Object.isFrozen(CADENCE)).toBe(true);
});
});
describe('oversizeSignal (§3 — план распух → дроби, не блок)', () => {
it('мало вопросов/тем → не oversize', () => {
expect(oversizeSignal({ questionCount: 3, themeCount: 1 })).toEqual({ oversize: false, reasons: [] });
});
it('десятки вопросов (≥20) → oversize (дроби на волны)', () => {
const r = oversizeSignal({ questionCount: 22, themeCount: 1 });
expect(r.oversize).toBe(true);
expect(r.reasons.some((x) => /волн/i.test(x))).toBe(true);
});
it('дюжина вопросов (12) при дефолте 20 → НЕ oversize', () => {
expect(oversizeSignal({ questionCount: 12, themeCount: 1 }).oversize).toBe(false);
});
it('несколько независимых тем → oversize (дроби на под-разговоры)', () => {
const r = oversizeSignal({ questionCount: 2, themeCount: 4 });
expect(r.oversize).toBe(true);
expect(r.reasons.some((x) => /под-разговор/i.test(x))).toBe(true);
});
it('пороги — ручки (инъекция)', () => {
expect(oversizeSignal({ questionCount: 5 }, { questionThreshold: 4 }).oversize).toBe(true);
});
});