feat(engine): loop idle runner with enabledLoopActionIds

This commit is contained in:
ginnoir
2026-06-11 20:44:20 -05:00
parent 8d9484171f
commit 0de61d3e41
6 changed files with 101 additions and 0 deletions
+30
View File
@@ -70,6 +70,15 @@ describe('createSave()', () => {
expect(save.state.currentStoryNodeId).toBe('route_a_beat');
expect(save.state.seenStoryNodeIds).toHaveLength(2);
});
it('snapshots enabledLoopActionIds in the save payload and isolates from mutation', () => {
const state = sampleState();
state.enabledLoopActionIds = { rest: true };
const save = createSave(state, 1700);
expect(save.state.enabledLoopActionIds).toEqual({ rest: true });
state.enabledLoopActionIds.rest = false;
expect(save.state.enabledLoopActionIds).toEqual({ rest: true });
});
});
describe('serialize / deserialize round-trip', () => {
@@ -84,6 +93,27 @@ describe('serialize / deserialize round-trip', () => {
const restored = fromExportString(toExportString(save));
expect(restored).toEqual(save);
});
it('preserves enabledLoopActionIds through a round-trip', () => {
const state = sampleState();
state.enabledLoopActionIds = { rest: true, patrol: false };
const restored = deserializeSave(serializeSave(createSave(state, 1700)));
expect(restored.state.enabledLoopActionIds).toEqual({ rest: true, patrol: false });
});
it('defaults enabledLoopActionIds to {} when absent from save JSON', () => {
const json = JSON.stringify({
version: 1,
savedAt: 1700,
state: {
resources: { gold: 0 },
activeActionId: null,
actionElapsedMs: 0,
},
});
const restored = deserializeSave(json);
expect(restored.state.enabledLoopActionIds).toEqual({});
});
});
describe('invalid / tampered saves', () => {