// Verifies that "Reset all to preset default" restores every parameter and
// triggers a respawn — matching the semantics of selectPreset, so spawn
// pattern, population shares and agent count revert visually too.
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { DEFAULT_PRESET } from '~/presets/builtIn';
import {
presetState,
resetEdited,
selectPreset,
updateEdited,
updateMatrixCell,
updateSpecies,
} from '~/stores/presetStore';
import { uiState } from '~/stores/uiStore';
beforeEach(() => {
const store = new Map<string, string>();
vi.stubGlobal('localStorage', {
getItem: (k: string) => store.get(k) ?? null,
setItem: (k: string, v: string) => {
store.set(k, v);
},
removeItem: (k: string) => {
store.delete(k);
},
clear: () => store.clear(),
key: () => null,
length: 0,
});
selectPreset(DEFAULT_PRESET);
});
afterEach(() => {
vi.unstubAllGlobals();
});
describe('resetEdited', () => {
it('restores every mutated field back to current.params', () => {
updateEdited('decayRate', 0.7);
updateEdited('exposure', 5);
updateMatrixCell(1, 2, -0.9);
updateSpecies(0, 'moveSpeed', 7);
expect(presetState.isDirty).toBe(true);
resetEdited();
expect(presetState.edited.decayRate).toBe(DEFAULT_PRESET.params.decayRate);
expect(presetState.edited.exposure).toBe(DEFAULT_PRESET.params.exposure);
expect(presetState.edited.interactionMatrix[1][2]).toBe(
DEFAULT_PRESET.params.interactionMatrix[1][2],
);
expect(presetState.edited.species[0].moveSpeed).toBe(
DEFAULT_PRESET.params.species[0].moveSpeed,
);
expect(presetState.isDirty).toBe(false);
});
it('triggers a respawn so seeding-time params revert visually', () => {
const before = uiState.respawnNonce;
resetEdited();
expect(uiState.respawnNonce).toBeGreaterThan(before);
});
it('does not throw on the reactive proxy (no DataCloneError)', () => {
updateEdited('contrast', 1.4);
expect(() => resetEdited()).not.toThrow();
});
});