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