FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
simulationProgress.test.ts
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
3
4import { beforeEach, describe, expect, test } from 'bun:test';
5import { useSimulationProgressStore } from '../simulationProgressStore';
6import { useScenarioStore } from './index';
7import {
8 resetSyncQueueForTests,
9 setSyncQueueInvokerForTests,
10 waitForSyncIdle,
11} from './syncQueue';
12
13type InvokeFn = typeof import('@tauri-apps/api/core').invoke;
14
15describe('simulation progress lifecycle', () => {
16 beforeEach(() => {
17 resetSyncQueueForTests();
18 setSyncQueueInvokerForTests((async () => []) as InvokeFn);
19 useSimulationProgressStore.setState({
20 isSimulating: false,
21 simulationProgress: {},
22 simulationRunStatus: 'idle',
23 simulationRunError: null,
24 simulationOutputMetadata: null,
25 });
26 });
27
28 test('clears previous progress when a simulation starts', () => {
29 useSimulationProgressStore.setState({
30 simulationProgress: {
31 main: {
32 message: 'Finished previous simulation',
33 current: 100,
34 total: 100,
35 },
36 },
37 simulationRunStatus: 'completed',
38 simulationRunError: 'old error',
39 simulationOutputMetadata: {
40 schema_version: 1,
41 simulation_name: 'previous',
42 output_directory: '.',
43 start_time: 0,
44 end_time: 1,
45 sampling_rate: 1000,
46 oversample_ratio: 1,
47 files: [],
48 },
49 });
50
51 useSimulationProgressStore.getState().startSimulationRun();
52
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();
59 });
60
61 test('preserves progress when a simulation completes', () => {
62 const progress = {
63 main: {
64 message: 'Simulating: 100%',
65 current: 100,
66 total: 100,
67 },
68 Receiver1: {
69 message: 'Finished Exporting Receiver1',
70 current: 100,
71 total: 100,
72 },
73 };
74
75 useSimulationProgressStore.getState().startSimulationRun();
76 useSimulationProgressStore
77 .getState()
78 .setSimulationProgressSnapshot(progress);
79 useSimulationProgressStore.getState().completeSimulationRun();
80
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);
86 });
87
88 test('preserves progress and records the error when a simulation fails', () => {
89 const progress = {
90 main: {
91 message: 'Simulating: 40%',
92 current: 40,
93 total: 100,
94 },
95 };
96
97 useSimulationProgressStore.getState().startSimulationRun();
98 useSimulationProgressStore
99 .getState()
100 .setSimulationProgressSnapshot(progress);
101 useSimulationProgressStore
102 .getState()
103 .failSimulationRun('Simulation failed');
104
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);
110 });
111
112 test('resetScenario clears stored simulation progress', async () => {
113 useSimulationProgressStore.setState({
114 isSimulating: true,
115 simulationProgress: {
116 main: {
117 message: 'Simulating: 70%',
118 current: 70,
119 total: 100,
120 },
121 },
122 simulationRunStatus: 'running',
123 simulationRunError: 'old error',
124 simulationOutputMetadata: {
125 schema_version: 1,
126 simulation_name: 'old',
127 output_directory: '.',
128 start_time: 0,
129 end_time: 1,
130 sampling_rate: 1000,
131 oversample_ratio: 1,
132 files: [],
133 },
134 });
135
136 useScenarioStore.getState().resetScenario();
137 await waitForSyncIdle();
138
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();
145 });
146});