62 lines
2.3 KiB
TypeScript
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');
|
|
});
|
|
});
|