diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-27 15:36:48 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-27 15:36:48 +0200 |
| commit | 63b658f8fba0790aa5b6bf94d4c89012f552a7ca (patch) | |
| tree | 21ad3cffef8893316b347e2b2182bfc4ab5b7c37 | |
| parent | 69c5dbf50c36ae622c02b943cc6c471254bb2fa9 (diff) | |
Fix replay event visibility for loaded raft simulation
| -rw-r--r-- | src/main/java/core/VSTaskManager.java | 7 | ||||
| -rw-r--r-- | src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java | 30 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/main/java/core/VSTaskManager.java b/src/main/java/core/VSTaskManager.java index bd95a4e..c78af5b 100644 --- a/src/main/java/core/VSTaskManager.java +++ b/src/main/java/core/VSTaskManager.java @@ -553,7 +553,12 @@ public class VSTaskManager implements VSSerializable { for (int i = 0; i < numTasks; ++i) { VSTask task = new VSTask(serialize, objectInputStream); - addTask(task, task.isProgrammed()); + /* + * Serialized tasks define the replay state of a loaded simulation. + * Register them as programmed so they remain visible in the Event + * view and survive reset/replay after deserialization. + */ + addTask(task, PROGRAMMED); } /** For later backwards compatibility, to add more stuff */ diff --git a/src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java b/src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java index 7bb6038..34908bb 100644 --- a/src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java +++ b/src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java @@ -1,6 +1,7 @@ package core; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.lang.reflect.Field; @@ -21,6 +22,7 @@ import testing.HeadlessLoader; class VSTaskManagerCrashRecoveryIntegrationTest { private static final long ADVANCE_STEP_MS = 1L; + private static final String RAFT_REPLAY = "saved-simulations/raft.dat"; private VSSimulator simulatorToStop; private VSSimulator loadedSimulatorToStop; @@ -118,6 +120,34 @@ class VSTaskManagerCrashRecoveryIntegrationTest { } @Test + @DisplayName("Loaded raft replay keeps crash and recover events visible in Event view collections") + void loadedRaftReplayKeepsCrashAndRecoverEventsVisible() throws Exception { + HeadlessLoader.LoadedSimulation loaded = + HeadlessLoader.load(RAFT_REPLAY, prefs.VSDefaultPrefs.init()); + loadedSimulatorToStop = loaded.getSimulator(); + + VSSimulatorVisualization visualization = loaded.getVisualization(); + VSTaskManager taskManager = visualization.getTaskManager(); + VSInternalProcess process0 = visualization.getProcess(0); + VSInternalProcess process2 = visualization.getProcess(2); + + assertEquals(6, taskManager.getGlobalTasks().size(), + "loaded raft replay should expose all saved global tasks"); + assertEquals(3, taskManager.getProcessGlobalTasks(process0).size(), + "process 0 should expose its activation, crash, and recover events"); + assertEquals(2, taskManager.getProcessGlobalTasks(process2).size(), + "process 2 should expose its activation and later crash event"); + + runUntil(visualization, 12001); + assertEquals(3, taskManager.getProcessGlobalTasks(process0).size(), + "process 0 recover event should remain visible after it executes"); + + runUntil(visualization, 20001); + assertEquals(2, taskManager.getProcessGlobalTasks(process2).size(), + "process 2 later crash event should remain visible after it executes"); + } + + @Test @DisplayName("Live GUI-style event injection supports recover and later crash") void liveEventInjectionSupportsRecoverAndLaterCrash() throws Exception { VSSimulator simulator = new SimulationBuilder() |
