30 lines
1.3 KiB
JavaScript
30 lines
1.3 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { createPointer, advance, enterSubPlan, exitSubPlan, currentPath, isDone } from './step-pointer.mjs';
|
|
|
|
describe('step-pointer (волны: линейный → дерево указателей, D6/OQ1)', () => {
|
|
it('линейное продвижение даёт путь [n]', () => {
|
|
let p = createPointer({ length: 3 });
|
|
expect(currentPath(p)).toEqual([0]);
|
|
p = advance(p); expect(currentPath(p)).toEqual([1]);
|
|
});
|
|
it('вход в под-план углубляет путь, выход возвращает', () => {
|
|
let p = createPointer({ length: 2 });
|
|
p = enterSubPlan(p, { length: 2 });
|
|
expect(currentPath(p)).toEqual([0, 0]);
|
|
p = advance(p); expect(currentPath(p)).toEqual([0, 1]);
|
|
p = exitSubPlan(p);
|
|
p = advance(p); expect(currentPath(p)).toEqual([1]);
|
|
});
|
|
it('isDone когда корень исчерпан', () => {
|
|
let p = createPointer({ length: 1 });
|
|
expect(isDone(p)).toBe(false);
|
|
p = advance(p);
|
|
expect(isDone(p)).toBe(true);
|
|
});
|
|
it('линейный режим обратно совместим (один уровень = число indexAtRoot)', () => {
|
|
let p = createPointer({ length: 5 });
|
|
p = advance(advance(p));
|
|
expect(p.indexAtRoot).toBe(2);
|
|
});
|
|
});
|