aboutsummaryrefslogtreecommitdiff
path: root/internal/world/hardening_room_id_mismatch_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/world/hardening_room_id_mismatch_test.go')
-rw-r--r--internal/world/hardening_room_id_mismatch_test.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/world/hardening_room_id_mismatch_test.go b/internal/world/hardening_room_id_mismatch_test.go
new file mode 100644
index 0000000..1ac1711
--- /dev/null
+++ b/internal/world/hardening_room_id_mismatch_test.go
@@ -0,0 +1,73 @@
+package world
+
+import (
+ "bytes"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+)
+
+// Regression: a room file whose declared id: disagrees with its numeric
+// filename was silently loaded under the filename with no diagnostic.
+// World.LoadRoom must warn, because room identity comes from the filename.
+
+func writeRoomFile(t *testing.T, dir, name, body string) {
+ t.Helper()
+ path := filepath.Join(dir, "rooms", name)
+ if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile(path, []byte(body), 0o644); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func captureRoomLog(t *testing.T, fn func()) string {
+ t.Helper()
+ var buf bytes.Buffer
+ old := log.Writer()
+ log.SetOutput(&buf)
+ defer log.SetOutput(old)
+ fn()
+ return buf.String()
+}
+
+func TestWorldWarnsOnDeclaredRoomIDMismatch(t *testing.T) {
+ dir := t.TempDir()
+ writeRoomFile(t, dir, "1.yaml", "id: 2\nname: Wrong Id\n")
+ w := New(dir)
+
+ out := captureRoomLog(t, func() {
+ room, err := w.LoadRoom(1)
+ if err != nil {
+ t.Fatalf("load room: %v", err)
+ }
+ if room.ID != 1 {
+ t.Fatalf("filename must win: room.ID = %d, want 1", room.ID)
+ }
+ })
+ if !strings.Contains(out, "declares id") {
+ t.Fatalf("expected a room id-mismatch warning, got log %q", out)
+ }
+}
+
+func TestWorldDoesNotWarnWhenRoomIDMatchesOrAbsent(t *testing.T) {
+ dir := t.TempDir()
+ writeRoomFile(t, dir, "1.yaml", "id: 1\nname: Match\n")
+ writeRoomFile(t, dir, "2.yaml", "name: Absent\n")
+ w := New(dir)
+
+ out := captureRoomLog(t, func() {
+ if _, err := w.LoadRoom(1); err != nil {
+ t.Fatal(err)
+ }
+ if _, err := w.LoadRoom(2); err != nil {
+ t.Fatal(err)
+ }
+ })
+ if strings.Contains(out, "declares id") {
+ t.Fatalf("unexpected room id-mismatch warning: %q", out)
+ }
+}