summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-27 15:36:48 +0200
committerPaul Buetow <paul@buetow.org>2026-03-27 15:36:48 +0200
commit63b658f8fba0790aa5b6bf94d4c89012f552a7ca (patch)
tree21ad3cffef8893316b347e2b2182bfc4ab5b7c37
parent69c5dbf50c36ae622c02b943cc6c471254bb2fa9 (diff)
Fix replay event visibility for loaded raft simulation
-rw-r--r--src/main/java/core/VSTaskManager.java7
-rw-r--r--src/test/java/core/VSTaskManagerCrashRecoveryIntegrationTest.java30
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()