aboutsummaryrefslogtreecommitdiff
path: root/internal/world/room_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/world/room_test.go')
-rw-r--r--internal/world/room_test.go92
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)
+ }
+ }
+}