import { describe, expect, it } from 'vitest';
import { orbitPosition, modelStats } from '../modelViewer';
import { mannequin } from '../../models/mannequin';
describe('ModelViewer — чистые части (урок №3)', () => {
it('орбита: yaw 0 — камера по +x, pitch 0 — на горизонтали', () => {
expect(orbitPosition(0, 0, 10, [0, 4, 0])).toEqual([10, 4, 0]);
// pitch π/2 — строго над целью
const top = orbitPosition(0.7, Math.PI / 2, 12, [1, 2, 3]);
expect(top[0]).toBeCloseTo(1, 6);
expect(top[1]).toBeCloseTo(14, 6);
expect(top[2]).toBeCloseTo(3, 6);
// yaw π/2 — по +z; дистанция масштабирует горизонтальные составляющие
const p = orbitPosition(Math.PI / 2, 0, 5, [0, 0, 0]);
expect(p[0]).toBeCloseTo(0, 6);
expect(p[2]).toBeCloseTo(5, 6);
});
it('статы манекена: воксели/кости/тайли считаются по сетке', () => {
const { model, rig } = mannequin();
const s = modelStats(model, rig);
expect(s.size).toEqual([10, 16, 4]);
expect(s.voxels).toBe(164);
expect(s.bones).toBe(5);
expect(s.tiles).toBe(16);
// без риги — 0 костей
expect(modelStats(model).bones).toBe(0);
});
});