From 4a5a30ec6dcbf972c7243cd7265fdb936fb29832 Mon Sep 17 00:00:00 2001 From: Robert Lippmann Date: Sat, 18 Apr 2026 04:14:34 -0400 Subject: [PATCH] test: add engine state immutability coverage --- tests/engine_state_immutability.test.ts | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/engine_state_immutability.test.ts diff --git a/tests/engine_state_immutability.test.ts b/tests/engine_state_immutability.test.ts new file mode 100644 index 0000000..d3cdf5e --- /dev/null +++ b/tests/engine_state_immutability.test.ts @@ -0,0 +1,41 @@ +import { describe, expect, it } from 'vitest'; +import { createEngine } from '../src/engine.js'; + +describe('engine state immutability', () => { + it('engine.state snapshot mutation does not affect internal engine state', () => { + const engine = createEngine(); + engine.step('use docker'); + + const snapshot = engine.state; + snapshot.policies.docker = 'prohibit'; + + expect(engine.state.policies.docker).toBe('use'); + }); + + it('constructor does not alias caller-provided initial state object', () => { + const init = { + premise: null, + policies: { docker: 'use' as const }, + version: 2 as const + }; + + const engine = createEngine({ state: init }); + + init.policies.docker = 'prohibit'; + + expect(engine.state.policies.docker).toBe('use'); + }); + + it('decision.state mutation does not affect internal engine state', () => { + const engine = createEngine(); + const decision = engine.step('use docker'); + + expect(decision.kind).toBe('update'); + expect(decision.state).not.toBeNull(); + + const decisionState = decision.state!; + decisionState.policies.docker = 'prohibit'; + + expect(engine.state.policies.docker).toBe('use'); + }); +});