Newer
Older
rpg / apps / game / src / systems / __tests__ / clock.test.ts
import { describe, expect, it } from 'vitest';
import { DAY_MINUTES, GameClock, START_MINUTES } from '../Clock';

describe('GameClock', () => {
    it('старт: 8:00, night-вход hours = 8', () => {
        const c = new GameClock();
        expect(c.minutes).toBe(480);
        expect(c.hours).toBe(8);
        expect(c.label).toBe('8:00');
    });

    it('advance: dtSec секунды = столько же игровых минут', () => {
        const c = new GameClock();
        c.advance(60); // 1 реальная минута = 1 игровой час
        expect(c.minutes).toBe(540);
        expect(c.label).toBe('9:00');
    });

    it('advance: переход через полночь', () => {
        const c = new GameClock();
        c.set(23 * 60 + 50);
        c.advance(20);
        expect(c.minutes).toBe(10);
        expect(c.label).toBe('0:10');
    });

    it('label: минуты с ведущим нулём, часы без', () => {
        const c = new GameClock();
        c.set(13 * 60 + 5);
        expect(c.label).toBe('13:05');
        c.set(45);
        expect(c.label).toBe('0:45');
    });

    it('set: mod 1440, отрицательные в диапазон', () => {
        const c = new GameClock();
        c.set(1500);
        expect(c.minutes).toBe(60);
        c.set(-60);
        expect(c.minutes).toBe(23 * 60);
    });

    it('reset возвращает к 8:00', () => {
        const c = new GameClock();
        c.set(0);
        c.reset();
        expect(c.minutes).toBe(START_MINUTES);
        expect(START_MINUTES).toBe(480);
        expect(DAY_MINUTES).toBe(1440);
    });

    it('hours — float для кривой света', () => {
        const c = new GameClock();
        c.set(19 * 60 + 30);
        expect(c.hours).toBeCloseTo(19.5, 10);
    });
});