1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4import { describe, expect, test } from 'bun:test';
5import type { SimulationProgressState } from '@/stores/simulationProgressStore';
7 addSimulationProgressEvent,
8 getSimulationProgressPercent,
9 normalizeCompletedProgressSnapshot,
10} from './simulationProgress';
12const trackProgress = (events: SimulationProgressState[]) => {
13 const tracked: Record<string, SimulationProgressState> = {};
15 for (const event of events) {
16 Object.assign(tracked, addSimulationProgressEvent(tracked, event));
22describe('simulation progress normalization', () => {
23 test('keeps CW receiver phases on one stable row', () => {
24 const tracked = trackProgress([
26 message: 'Finalizing CW Receiver CWRadar',
31 message: 'Rendering Interference for CWRadar',
36 message: 'Applying Noise for CWRadar',
41 message: 'Writing HDF5 for CWRadar',
46 message: 'Finalized CWRadar',
52 expect(Object.keys(tracked)).toEqual(['receiver:CWRadar']);
53 expect(tracked['receiver:CWRadar']).toEqual({
54 message: 'Finalized CWRadar',
60 message: 'Finalizing CW Receiver CWRadar',
65 id: 'cw-rendering-interference',
66 message: 'Rendering Interference for CWRadar',
71 id: 'cw-applying-noise',
72 message: 'Applying Noise for CWRadar',
77 id: 'cw-writing-hdf5',
78 message: 'Writing HDF5 for CWRadar',
84 message: 'Finalized CWRadar',
92 test('keeps pulsed export chunks and completion on one stable row', () => {
93 const tracked = trackProgress([
95 message: 'Exporting PulsedRadar: Chunk 9928',
100 message: 'Finished Exporting PulsedRadar',
106 expect(Object.keys(tracked)).toEqual(['receiver:PulsedRadar']);
107 expect(tracked['receiver:PulsedRadar']).toEqual({
108 message: 'Finished Exporting PulsedRadar',
114 message: 'Exporting PulsedRadar: Chunk 9928',
119 id: 'export-finished',
120 message: 'Finished Exporting PulsedRadar',
128 test('keeps only the latest chunk detail for high-volume export updates', () => {
129 const tracked = trackProgress([
131 message: 'Exporting PulsedRadar: Chunk 10',
136 message: 'Exporting PulsedRadar: Chunk 9928',
142 expect(tracked['receiver:PulsedRadar'].details).toEqual([
145 message: 'Exporting PulsedRadar: Chunk 9928',
152 test('keeps main simulation messages out of the detail list', () => {
153 const tracked = trackProgress([
155 message: 'Simulating... 1.00s / 10.00s',
160 message: 'Main simulation finished. Waiting for data export...',
165 message: 'Simulation complete',
171 expect(Object.keys(tracked)).toEqual(['main']);
172 expect(tracked.main).toEqual({
173 message: 'Simulation complete',
179 message: 'Simulating... 1.00s / 10.00s',
184 id: 'main-export-wait',
186 'Main simulation finished. Waiting for data export...',
192 message: 'Simulation complete',
200 test('marks known stale receiver and export rows complete after success', () => {
201 const completed = normalizeCompletedProgressSnapshot({
203 message: 'Finalizing CW Receiver CWRadar',
208 message: 'Writing HDF5 for CWRadar',
213 message: 'Exporting PulsedRadar: Chunk 9928',
218 message: 'Main simulation finished. Waiting for data export...',
224 expect(completed).toEqual({
225 'receiver:CWRadar': {
226 message: 'Finalized CWRadar',
232 message: 'Finalizing CW Receiver CWRadar',
237 id: 'cw-writing-hdf5',
238 message: 'Writing HDF5 for CWRadar',
244 message: 'Finalized CWRadar',
250 'receiver:PulsedRadar': {
251 message: 'Finished Exporting PulsedRadar',
257 message: 'Exporting PulsedRadar: Chunk 9928',
262 id: 'export-finished',
263 message: 'Finished Exporting PulsedRadar',
270 message: 'Simulation complete',
275 id: 'main-export-wait',
277 'Main simulation finished. Waiting for data export...',
283 message: 'Simulation complete',
292 test('clamps determinate progress percentages', () => {
294 getSimulationProgressPercent({
301 getSimulationProgressPercent({
308 getSimulationProgressPercent({