Zum Inhalt

tests/stores/resetEdited.test.ts

// 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();
  });
});