import { describe, expect, it } from 'vitest'; import { buildPier } from '../src/core/geometry'; import { overrideKeys, pendingKeys, revertDraft, type PierValues } from '../src/core/changes'; import { loadP1 } from './helpers'; function fresh(): PierValues { const input = loadP1(); return { defaults: input, input, draft: input }; } describe('input change tracking (plan B1 · C2)', () => { it('a new pier has no overrides and nothing pending', () => { const p = fresh(); expect(overrideKeys(p)).toEqual([]); expect(pendingKeys(p)).toEqual([]); }); it('coping width 3100 → 3300: one override and one pending change', () => { const p = fresh(); const next = { ...p, draft: { ...p.draft, copingWidthMm: 3300 } }; expect(overrideKeys(next)).toEqual(['copingWidthMm']); expect(pendingKeys(next)).toEqual(['copingWidthMm']); }); it('regenerating clears the pending change but keeps the override', () => { const p = fresh(); const edited = { ...p, draft: { ...p.draft, copingWidthMm: 3300 } }; const regenerated: PierValues = { ...edited, input: edited.draft }; expect(pendingKeys(regenerated)).toEqual([]); expect(overrideKeys(regenerated)).toEqual(['copingWidthMm']); expect(buildPier(regenerated.input).copingB).toBeCloseTo(3.3, 9); }); it('reverting to the default removes the override', () => { const p = fresh(); const edited = { ...p, draft: { ...p.draft, copingWidthMm: 3300 } }; const reverted = { ...edited, draft: revertDraft(edited, 'copingWidthMm') }; expect(overrideKeys(reverted)).toEqual([]); // The draft is back to the generated value, so nothing is pending either. expect(pendingKeys(reverted)).toEqual([]); }); });