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