72 lines
3.5 KiB
JavaScript
72 lines
3.5 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { slimProtocol, isLiveBranch, isLiveCandidate } from './secretary-slim.mjs';
|
|
|
|
const proto = () => ({
|
|
subject: 'дело', status: 'открыто', nextSvId: 3, nextKdId: 4,
|
|
decisions: [{ text: 'D1', struck: false }],
|
|
open: [{ text: 'O1' }], will: [], consequences: [], doneNext: [], history: [],
|
|
steps: [{ turn: 1, text: 'шаг 1' }],
|
|
hidden: [
|
|
{ id: 'СВ-1', lens: 'Л1', status: 'открыт', text: 'живая ветка' },
|
|
{ id: 'СВ-2', lens: 'Л4', status: 'закрыт', text: 'мёртвая (закрыт)' },
|
|
{ id: 'СВ-3', lens: 'Л6', status: 'отпал', text: 'мёртвая (отпал)' },
|
|
{ id: 'СВ-4', lens: 'Л7', status: 'мутировал', text: 'мёртвая (мутировал)' },
|
|
{ id: 'СВ-5', lens: 'Л8', text: 'живая без статуса' },
|
|
],
|
|
candidates: [
|
|
{ id: 'КД-1', status: 'жив', branch: 'живой кандидат' },
|
|
{ id: 'КД-2', branch: 'живой без статуса' },
|
|
{ id: 'КД-3', status: 'отпал', branch: 'мёртвый (отпал)' },
|
|
{ id: 'КД-4', status: 'мутировал', branch: 'мёртвый (мутировал)' },
|
|
{ id: 'КД-5', status: 'закрыт', branch: 'мёртвый (закрыт)' },
|
|
{ id: 'КД-6', status: 'повышен', branch: 'мёртвый (повышен)' },
|
|
],
|
|
extraNewField: 'forward-safe',
|
|
});
|
|
|
|
describe('slimProtocol', () => {
|
|
it('оставляет только живые ветки (выкидывает закрыт/отпал/мутировал)', () => {
|
|
const s = slimProtocol(proto());
|
|
expect(s.hidden.map((h) => h.id)).toEqual(['СВ-1', 'СВ-5']);
|
|
});
|
|
it('оставляет только живых кандидатов (нет статуса или жив)', () => {
|
|
const s = slimProtocol(proto());
|
|
expect(s.candidates.map((c) => c.id)).toEqual(['КД-1', 'КД-2']);
|
|
});
|
|
it('переносит ствол/шаги/счётчики/новые поля как есть', () => {
|
|
const s = slimProtocol(proto());
|
|
expect(s.decisions).toEqual([{ text: 'D1', struck: false }]);
|
|
expect(s.steps).toEqual([{ turn: 1, text: 'шаг 1' }]);
|
|
expect(s.nextSvId).toBe(3);
|
|
expect(s.nextKdId).toBe(4);
|
|
expect(s.subject).toBe('дело');
|
|
expect(s.extraNewField).toBe('forward-safe');
|
|
});
|
|
it('не мутирует вход (мёртвые остаются в исходном proto)', () => {
|
|
const p = proto();
|
|
slimProtocol(p);
|
|
expect(p.hidden).toHaveLength(5);
|
|
expect(p.candidates).toHaveLength(6);
|
|
});
|
|
it('терпит пустой/кривой вход', () => {
|
|
expect(slimProtocol({}).hidden).toEqual([]);
|
|
expect(slimProtocol({}).candidates).toEqual([]);
|
|
expect(slimProtocol(null)).toEqual(null);
|
|
});
|
|
it('предикаты живости', () => {
|
|
expect(isLiveBranch({ status: 'открыт' })).toBe(true);
|
|
expect(isLiveBranch({})).toBe(true);
|
|
expect(isLiveBranch({ status: 'закрыт' })).toBe(false);
|
|
expect(isLiveCandidate({ status: 'жив' })).toBe(true);
|
|
expect(isLiveCandidate({})).toBe(true);
|
|
expect(isLiveCandidate({ status: 'повышен' })).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('slimProtocol — knowledge', () => {
|
|
it('сохраняет базу знаний целиком', () => {
|
|
const s = slimProtocol({ knowledge: [{ ref: 'a', text: 'b' }], hidden: [], candidates: [] });
|
|
expect(s.knowledge).toEqual([{ ref: 'a', text: 'b' }]);
|
|
});
|
|
});
|