Files
2026-05-06 08:17:32 +08:00

62 lines
2.3 KiB
TypeScript

import { UIFlowMgr, ISceneEnter } from '@ui/UIFlowMgr';
import { StorageMgr } from '@common/StorageMgr';
import { STORAGE_KEY } from '@common/Constants';
function mem() {
const m = new Map<string, string>();
return {
getItem: (k: string) => (m.has(k) ? (m.get(k) as string) : null),
setItem: (k: string, v: string) => {
m.set(k, v);
},
removeItem: (k: string) => {
m.delete(k);
},
};
}
describe('UIFlowMgr — boot path (req 19.1, 19.5)', () => {
it('routes first-time boot into story_intro', () => {
const events: ISceneEnter[] = [];
const flow = new UIFlowMgr(new StorageMgr(mem()), { onSceneEnter: (e) => events.push(e) });
flow.onBoot();
expect(events[0].scene).toBe('story_intro');
});
it('routes repeat boot into main_menu', () => {
const storage = new StorageMgr(mem());
storage.set(STORAGE_KEY.StoryIntroSeen, true);
const events: ISceneEnter[] = [];
const flow = new UIFlowMgr(storage, { onSceneEnter: (e) => events.push(e) });
flow.onBoot();
expect(events[0].scene).toBe('main_menu');
});
});
describe('UIFlowMgr — level/settlement/dead transitions', () => {
it('onPickLevel → gameplay with payload', () => {
const events: ISceneEnter[] = [];
const flow = new UIFlowMgr(new StorageMgr(mem()), { onSceneEnter: (e) => events.push(e) });
flow.onPickLevel('1-3');
expect(events[0]).toEqual({ scene: 'gameplay', payload: { levelId: '1-3' } });
});
it('onPlayerDied pushes a settlement with dead:true', () => {
const events: ISceneEnter[] = [];
const flow = new UIFlowMgr(new StorageMgr(mem()), { onSceneEnter: (e) => events.push(e) });
flow.onPlayerDied('1-2');
expect(events[0].scene).toBe('settlement');
expect(events[0].payload).toEqual({ levelId: '1-2', dead: true });
});
});
describe('UIFlowMgr — difficulty guardrail (req 13.1)', () => {
it('availableSettingsEntries does NOT include difficulty', () => {
const flow = new UIFlowMgr(new StorageMgr(mem()));
const entries = flow.availableSettingsEntries();
expect(entries).not.toContain('difficulty');
expect(entries).toContain('audio_volume');
expect(entries).toContain('replay_story_intro');
});
});