import { describe, expect, it } from 'vitest';
import { GameState } from '@rpg/engine';
import { migrateV1toV2, migrateV2toV3, registerStateMigrations, STATE_DATA_VERSION } from '../migrations';
describe('миграции GameStateData', () => {
it('v1→v2: знакомства переименованы, остальное перенесено, version=2', () => {
const out = migrateV1toV2({
version: 1,
flags: ['metElder', 'quest_bells_taken', 'metTrader'],
vars: { flowers: 3 }
});
expect(out.version).toBe(2);
expect(out.flags).toEqual(['met_elder', 'quest_bells_taken', 'met_mila']);
expect(out.vars).toEqual({ flowers: 3 });
});
it('v2→v3: флаг evening удалён, остальное перенесено, version=3', () => {
const out = migrateV2toV3({
version: 2,
flags: ['evening', 'quest_bells_done', 'hint_bells'],
vars: { flowers: 3 }
});
expect(out.version).toBe(3);
expect(out.flags).toEqual(['quest_bells_done', 'hint_bells']);
expect(out.vars).toEqual({ flowers: 3 });
});
it('старый сейв v1 читается state.load с миграцией до текущей версии', () => {
const s = new GameState();
registerStateMigrations(s);
expect(s.dataVersion).toBe(STATE_DATA_VERSION);
s.load({ version: 1, flags: ['metElder', 'metTrader'], vars: {} });
expect(s.hasFlag('met_elder')).toBe(true);
expect(s.hasFlag('met_mila')).toBe(true);
expect(s.hasFlag('metElder')).toBe(false);
expect(s.hasFlag('metTrader')).toBe(false);
});
it('сейв текущей версии миграций не получает', () => {
const s = new GameState();
registerStateMigrations(s);
s.load({ version: STATE_DATA_VERSION, flags: ['quest_bells_done'], vars: {} });
expect(s.hasFlag('quest_bells_done')).toBe(true);
expect(s.allFlags).toEqual(['quest_bells_done']);
// сериализация — в текущей версии
expect(s.serialize().version).toBe(STATE_DATA_VERSION);
});
});