From 3c7c9d2ad4f32877159ead8feafa6f20267694c3 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Mon, 1 Jun 2026 14:42:15 +0200 Subject: [PATCH] fix(save): restore visited set before setting current room; strengthen null-tolerance test Reorder apply() so visitedRoomIds is restored before setCurrentRoom() is called, ensuring the current room is never accidentally stripped from the visited set by the subsequent clear(). Also adds a post-condition assertion to applyToleratesMissingCollections that proves null roomItemIds leaves room item tables empty after apply. Co-Authored-By: Claude Sonnet 4.6 --- .../src/main/java/thb/jeanluc/adventure/save/SaveCodec.java | 2 +- .../src/test/java/thb/jeanluc/adventure/save/SaveCodecTest.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/SaveCodec.java b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/SaveCodec.java index 3cce28b..0f27340 100644 --- a/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/SaveCodec.java +++ b/Semesterprojekt/src/main/java/thb/jeanluc/adventure/save/SaveCodec.java @@ -95,9 +95,9 @@ public final class SaveCodec { } // 3. Player position + visited + gold. - p.setCurrentRoom(requireRoom(w, data.currentRoomId())); p.getVisitedRoomIds().clear(); p.getVisitedRoomIds().addAll(data.visitedRoomIds()); + p.setCurrentRoom(requireRoom(w, data.currentRoomId())); p.setGold(data.gold()); // 4. Flags, quests, turn. diff --git a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SaveCodecTest.java b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SaveCodecTest.java index ed1b1ca..569589e 100644 --- a/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SaveCodecTest.java +++ b/Semesterprojekt/src/test/java/thb/jeanluc/adventure/save/SaveCodecTest.java @@ -101,5 +101,7 @@ class SaveCodecTest { GameSession dst = freshWorld("slot-a"); // Should not throw NPE; world items remain in their default positions or cleared org.junit.jupiter.api.Assertions.assertDoesNotThrow(() -> SaveCodec.apply(data, dst)); + // Post-condition: applying a save with null/empty roomItemIds clears all room item tables. + assertThat(dst.getWorld().getRooms().get("kitchen").findItem("lamp")).isEmpty(); } }