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