import { describe, expect, it } from 'vitest';
import { FrameAnimation } from '../FrameAnimation';
/** Подмена Sprite: аниматору нужен только writeable `texture`. */
function fakeSprite() {
return { texture: 'initial' as unknown };
}
const t1 = { id: 1 } as never;
const t2 = { id: 2 } as never;
const t3 = { id: 3 } as never;
describe('FrameAnimation (обёртка SpriteAnimator, совместимость)', () => {
it('цикл: кадры сменяются по fps, texture пишется', () => {
const sprite = fakeSprite();
const anim = new FrameAnimation(sprite as never, [t1, t2, t3], 10, true);
expect(sprite.texture).toBe(t1); // стартовый кадр отрисован сразу
anim.update(0.1);
expect(sprite.texture).toBe(t2);
anim.update(0.1);
expect(sprite.texture).toBe(t3);
anim.update(0.1);
expect(sprite.texture).toBe(t1); // зациклилось
});
it('loop=false: стоп на последнем кадре', () => {
const sprite = fakeSprite();
const anim = new FrameAnimation(sprite as never, [t1, t2], 10, false);
anim.update(0.1);
anim.update(0.1);
expect(sprite.texture).toBe(t2);
for (let i = 0; i < 5; i++) anim.update(0.1);
expect(sprite.texture).toBe(t2); // не уходит в минус индексы
});
it('setFrames без reset продолжает с текущего шага, с reset — с нуля', () => {
const sprite = fakeSprite();
const anim = new FrameAnimation(sprite as never, [t1, t2], 10, true);
anim.update(0.1); // шаг 1 (t2)
anim.setFrames([t3, t1]);
expect(sprite.texture).toBe(t1); // шаг 1 нового клипа
anim.setFrames([t1, t2], true);
expect(sprite.texture).toBe(t1); // reset → шаг 0
anim.update(0.1);
expect(sprite.texture).toBe(t2);
});
it('пустой список кадров не падает', () => {
const sprite = fakeSprite();
const anim = new FrameAnimation(sprite as never, [], 10, true);
expect(() => anim.update(0.1)).not.toThrow();
expect(sprite.texture).toBe('initial');
});
});