1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4import { beforeEach, describe, expect, test } from 'bun:test';
5import { useSimulationProgressStore } from '../simulationProgressStore';
6import { useScenarioStore } from './index';
8 resetSyncQueueForTests,
9 setSyncQueueInvokerForTests,
13type InvokeFn = typeof import('@tauri-apps/api/core').invoke;
15describe('simulation progress lifecycle', () => {
17 resetSyncQueueForTests();
18 setSyncQueueInvokerForTests((async () => []) as InvokeFn);
19 useSimulationProgressStore.setState({
21 simulationProgress: {},
22 simulationRunStatus: 'idle',
23 simulationRunError: null,
24 simulationOutputMetadata: null,
28 test('clears previous progress when a simulation starts', () => {
29 useSimulationProgressStore.setState({
32 message: 'Finished previous simulation',
37 simulationRunStatus: 'completed',
38 simulationRunError: 'old error',
39 simulationOutputMetadata: {
41 simulation_name: 'previous',
42 output_directory: '.',
51 useSimulationProgressStore.getState().startSimulationRun();
53 const state = useSimulationProgressStore.getState();
54 expect(state.isSimulating).toBe(true);
55 expect(state.simulationProgress).toEqual({});
56 expect(state.simulationRunStatus).toBe('running');
57 expect(state.simulationRunError).toBeNull();
58 expect(state.simulationOutputMetadata).toBeNull();
61 test('preserves progress when a simulation completes', () => {
64 message: 'Simulating: 100%',
69 message: 'Finished Exporting Receiver1',
75 useSimulationProgressStore.getState().startSimulationRun();
76 useSimulationProgressStore
78 .setSimulationProgressSnapshot(progress);
79 useSimulationProgressStore.getState().completeSimulationRun();
81 const state = useSimulationProgressStore.getState();
82 expect(state.isSimulating).toBe(false);
83 expect(state.simulationRunStatus).toBe('completed');
84 expect(state.simulationRunError).toBeNull();
85 expect(state.simulationProgress).toEqual(progress);
88 test('preserves progress and records the error when a simulation fails', () => {
91 message: 'Simulating: 40%',
97 useSimulationProgressStore.getState().startSimulationRun();
98 useSimulationProgressStore
100 .setSimulationProgressSnapshot(progress);
101 useSimulationProgressStore
103 .failSimulationRun('Simulation failed');
105 const state = useSimulationProgressStore.getState();
106 expect(state.isSimulating).toBe(false);
107 expect(state.simulationRunStatus).toBe('failed');
108 expect(state.simulationRunError).toBe('Simulation failed');
109 expect(state.simulationProgress).toEqual(progress);
112 test('resetScenario clears stored simulation progress', async () => {
113 useSimulationProgressStore.setState({
115 simulationProgress: {
117 message: 'Simulating: 70%',
122 simulationRunStatus: 'running',
123 simulationRunError: 'old error',
124 simulationOutputMetadata: {
126 simulation_name: 'old',
127 output_directory: '.',
136 useScenarioStore.getState().resetScenario();
137 await waitForSyncIdle();
139 const state = useSimulationProgressStore.getState();
140 expect(state.isSimulating).toBe(false);
141 expect(state.simulationProgress).toEqual({});
142 expect(state.simulationRunStatus).toBe('idle');
143 expect(state.simulationRunError).toBeNull();
144 expect(state.simulationOutputMetadata).toBeNull();