import { describe, it, expect } from 'vitest';
import { TintFlash, lerpColor } from '../flash';

describe('TintFlash', () => {
    it('не активен до start', () => {
        const f = new TintFlash(0xffffff, 0xff0000, 0.2);
        expect(f.active).toBe(false);
        expect(f.update(0.1)).toBeNull();
    });

    it('в начале — исходный цвет, в середине — ближе к вспышке', () => {
        const f = new TintFlash(0xffffff, 0xff0000, 0.2);
        f.start();
        expect(f.update(0)).toBe(0xffffff);
        const mid = f.update(0.1); // середина: максимум вспышки
        expect(mid).toBe(0xff0000);
    });

    it('к концу возвращается к исходному, затем null', () => {
        const f = new TintFlash(0xffffff, 0xff0000, 0.2);
        f.start();
        f.update(0.19);
        const end = f.update(0.05); // пересекли границу
        expect(end).toBe(0xffffff);
        expect(f.active).toBe(false);
        expect(f.update(0.05)).toBeNull();
    });

    it('повторный запуск работает', () => {
        const f = new TintFlash(0xffffff, 0x00ff00, 0.1);
        f.start();
        f.update(0.2); // завершён
        f.start();
        expect(f.active).toBe(true);
        expect(f.update(0)).toBe(0xffffff);
    });
});

describe('lerpColor', () => {
    it('края и середина', () => {
        expect(lerpColor(0x000000, 0xffffff, 0)).toBe(0x000000);
        expect(lerpColor(0x000000, 0xffffff, 1)).toBe(0xffffff);
        expect(lerpColor(0x000000, 0xffffff, 0.5)).toBe(0x808080);
    });

    it('по каналам, не по всему числу', () => {
        // от красного к синему: середина — фиолетовый (0x800080), а не «серый мусор»
        expect(lerpColor(0xff0000, 0x0000ff, 0.5)).toBe(0x800080);
        expect(lerpColor(0x102030, 0x102030, 0.7)).toBe(0x102030);
    });
});