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 <noreply@anthropic.com>
This commit is contained in:
@@ -95,9 +95,9 @@ public final class SaveCodec {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. Player position + visited + gold.
|
// 3. Player position + visited + gold.
|
||||||
p.setCurrentRoom(requireRoom(w, data.currentRoomId()));
|
|
||||||
p.getVisitedRoomIds().clear();
|
p.getVisitedRoomIds().clear();
|
||||||
p.getVisitedRoomIds().addAll(data.visitedRoomIds());
|
p.getVisitedRoomIds().addAll(data.visitedRoomIds());
|
||||||
|
p.setCurrentRoom(requireRoom(w, data.currentRoomId()));
|
||||||
p.setGold(data.gold());
|
p.setGold(data.gold());
|
||||||
|
|
||||||
// 4. Flags, quests, turn.
|
// 4. Flags, quests, turn.
|
||||||
|
|||||||
@@ -101,5 +101,7 @@ class SaveCodecTest {
|
|||||||
GameSession dst = freshWorld("slot-a");
|
GameSession dst = freshWorld("slot-a");
|
||||||
// Should not throw NPE; world items remain in their default positions or cleared
|
// Should not throw NPE; world items remain in their default positions or cleared
|
||||||
org.junit.jupiter.api.Assertions.assertDoesNotThrow(() -> SaveCodec.apply(data, dst));
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user