diff options
| author | historia <[not public]> | 2026-06-27 21:25:20 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-06-27 21:25:20 -0400 |
| commit | 87dacfbb3dd16e7f55a82361eace98f9a39d75c8 (patch) | |
| tree | d548f75a37b5b8e960c5e5d111237e172650bb59 /internal/world/room_test.go | |
| parent | 83f8f5447ec3baf85314ce7343f0e339d28bcc15 (diff) | |
| download | thehouseoficarus-87dacfbb3dd16e7f55a82361eace98f9a39d75c8.tar.gz | |
feat: room-specific objects can be defined inline in room yaml
Diffstat (limited to 'internal/world/room_test.go')
| -rw-r--r-- | internal/world/room_test.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/internal/world/room_test.go b/internal/world/room_test.go new file mode 100644 index 0000000..472fe4f --- /dev/null +++ b/internal/world/room_test.go @@ -0,0 +1,92 @@ +package world + +import ( + "os" + "path/filepath" + "testing" +) + +func writeRoom(t *testing.T, dir string, body string) { + t.Helper() + rooms := filepath.Join(dir, "rooms") + if err := os.MkdirAll(rooms, 0o755); err != nil { + t.Fatal(err) + } + path := filepath.Join(rooms, "1001.yaml") + if err := os.WriteFile(path, []byte(body), 0o644); err != nil { + t.Fatal(err) + } +} + +func TestRoomObjectReferenceVsInline(t *testing.T) { + dir := t.TempDir() + body := `name: Test Room +objects: + - id: workbench + - name: window + hidden: true + description: "A small window." + - id: control + name: instrument panel + aliases: [cockpit] + description: "A panel." +` + // rebuild the path index so LoadRoom can find the room file + writeRoom(t, dir, body) + w := New(dir) + + room, err := w.LoadRoom(1001) + if err != nil { + t.Fatalf("LoadRoom: %v", err) + } + if len(room.Objects) != 3 { + t.Fatalf("expected 3 objects, got %d", len(room.Objects)) + } + + // reference + if ref := room.Objects[0]; ref.Inline != nil || ref.ID != "workbench" { + t.Errorf("object 0 should be a reference to workbench, got %+v (inline=%v)", ref, ref.Inline) + } + + // inline, id derived from the normalized name + in := room.Objects[1] + if in.Inline == nil { + t.Fatalf("object 1 should be inline") + } + if in.ID != "window" { + t.Errorf("inline id should derive from name to %q, got %q", "window", in.ID) + } + if !in.Inline.Hidden || in.Inline.Name != "window" { + t.Errorf("inline fields not parsed: %+v", in.Inline) + } + + // inline with a multi-word name: id is the normalized name (spaces kept), + // and an explicit `id:` is NOT used as identity (it is preserved on the + // def only so validation can flag it). + ex := room.Objects[2] + if ex.Inline == nil { + t.Fatalf("object 2 should be inline") + } + if ex.ID != "instrument panel" { + t.Errorf("inline id should be normalized name %q, got %q", "instrument panel", ex.ID) + } + if ex.Inline.ID != "control" { + t.Errorf("explicit id should be preserved on def for validation, got %q", ex.Inline.ID) + } + if len(ex.Inline.Aliases) != 1 || ex.Inline.Aliases[0] != "cockpit" { + t.Errorf("inline aliases not parsed: %+v", ex.Inline.Aliases) + } +} + +func TestNormalizeObjectName(t *testing.T) { + cases := map[string]string{ + "window": "window", + "Instrument Panel": "instrument panel", + " Safety Card ": "safety card", + } + for in, want := range cases { + if got := NormalizeObjectName(in); got != want { + t.Errorf("NormalizeObjectName(%q) = %q, want %q", in, got, want) + } + } +} |
