aboutsummaryrefslogtreecommitdiff
path: root/internal/world/rekey_objects_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/world/rekey_objects_test.go')
-rw-r--r--internal/world/rekey_objects_test.go28
1 files changed, 28 insertions, 0 deletions
diff --git a/internal/world/rekey_objects_test.go b/internal/world/rekey_objects_test.go
index 7ee2de3..908e30b 100644
--- a/internal/world/rekey_objects_test.go
+++ b/internal/world/rekey_objects_test.go
@@ -35,3 +35,31 @@ func TestRekeyRoomsUpdatesObjStateRoomID(t *testing.T) {
t.Fatalf("AllObjInstances(1) = %d entries, want 0 (stale old room)", len(got))
}
}
+
+// Regression: an object away from its home room is keyed by its current room,
+// so the old key-driven walk left its HomeRoomID/WanderRooms stale and a later
+// entry to the renamed home created a duplicate instance.
+func TestRekeyRoomsUpdatesAwayFromHomeObject(t *testing.T) {
+ w := New(t.TempDir())
+ // Declared in home room 1, currently wandering in room 5.
+ w.objStates[w.ObjStateKey(5, "fishing_spot", 0)] = &ObjState{
+ RoomID: 5,
+ HomeRoomID: 1,
+ DefID: "fishing_spot",
+ Index: 0,
+ WanderRooms: []int{1, 5},
+ }
+
+ w.RekeyRooms(map[int]int{1: 20})
+
+ inst := w.GetObjState(5, "fishing_spot", 0)
+ if inst == nil {
+ t.Fatal("away object state lost after rekey")
+ }
+ if inst.HomeRoomID != 20 {
+ t.Fatalf("HomeRoomID = %d, want 20", inst.HomeRoomID)
+ }
+ if got := inst.WanderRooms; len(got) != 2 || got[0] != 20 || got[1] != 5 {
+ t.Fatalf("WanderRooms = %v, want [20 5]", got)
+ }
+}