From c705ae942573984784ef501bf8198f61f5206ddd Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Thu, 9 Jul 2026 05:27:10 -0400 Subject: refactor: simplify yaml, remove support for old scalar fields --- internal/admin/api_room_insert_remove_test.go | 101 +++++++++++++------------- 1 file changed, 51 insertions(+), 50 deletions(-) (limited to 'internal/admin/api_room_insert_remove_test.go') diff --git a/internal/admin/api_room_insert_remove_test.go b/internal/admin/api_room_insert_remove_test.go index 5a3b28e..6d80595 100644 --- a/internal/admin/api_room_insert_remove_test.go +++ b/internal/admin/api_room_insert_remove_test.go @@ -11,6 +11,7 @@ import ( "strings" "testing" + "thehouseoficarus/internal/behavior" "thehouseoficarus/internal/world" ) @@ -93,8 +94,8 @@ func postRemove(t *testing.T, s *AdminServer, body string) (map[string]any, int) // rewires A and B onto it, and pushes an undo entry that restores everything. func TestInsertSuccess(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n west: 1\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n west: {room: 1}\n", }) resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`) @@ -157,8 +158,8 @@ func TestInsertSuccess(t *testing.T) { // TestInsertDefaultName confirms an empty name falls back to "Room #". func TestInsertDefaultName(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n west: 1\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n west: {room: 1}\n", }) resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":""}`) if code != http.StatusOK { @@ -177,14 +178,14 @@ func TestInsertGridConflict(t *testing.T) { // 1→east→2→east→3 and 1→south→4→east→5→east→6→east→7→north→8 at (3,0,0). // Inserting between 1 and 2 pushes 3 to (3,0,0), colliding with 8. s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n south: 4\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n west: 2\n", - 4: "name: D\nexits:\n east: 5\n north: 1\n", - 5: "name: E\nexits:\n east: 6\n west: 4\n", - 6: "name: F\nexits:\n east: 7\n west: 5\n", - 7: "name: G\nexits:\n north: 8\n west: 6\n", - 8: "name: H\nexits:\n south: 7\n", + 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", + 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n", + 5: "name: E\nexits:\n east: {room: 6}\n west: {room: 4}\n", + 6: "name: F\nexits:\n east: {room: 7}\n west: {room: 5}\n", + 7: "name: G\nexits:\n north: {room: 8}\n west: {room: 6}\n", + 8: "name: H\nexits:\n south: {room: 7}\n", }) resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"X"}`) if code != http.StatusConflict { @@ -210,9 +211,9 @@ func TestInsertGridConflict(t *testing.T) { // undo/redo round-trip. func TestRemoveSuccess(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n west: 2\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", }) resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`) if code != http.StatusOK { @@ -282,8 +283,8 @@ func TestRemoveGuards(t *testing.T) { { name: "no such exit", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n west: 1\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n west: {room: 1}\n", }, body: `{"from":1,"dir":"north"}`, want: "has no north exit", @@ -291,7 +292,7 @@ func TestRemoveGuards(t *testing.T) { { name: "self loop", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 1\n", + 1: "name: A\nexits:\n east: {room: 1}\n", }, body: `{"from":1,"dir":"east"}`, want: "loops back", @@ -299,9 +300,9 @@ func TestRemoveGuards(t *testing.T) { { name: "not an insert chain (B does not lead back)", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n", - 3: "name: C\nexits:\n west: 2\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", }, body: `{"from":1,"dir":"east"}`, want: "not an insert chain", @@ -309,8 +310,8 @@ func TestRemoveGuards(t *testing.T) { { name: "dead end (B has no forward exit)", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n west: 1\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n west: {room: 1}\n", }, body: `{"from":1,"dir":"east"}`, want: "no room beyond", @@ -318,10 +319,10 @@ func TestRemoveGuards(t *testing.T) { { name: "B has extra exits", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n north: 4\n", - 3: "name: C\nexits:\n west: 2\n", - 4: "name: D\nexits:\n south: 2\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n north: {room: 4}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", + 4: "name: D\nexits:\n south: {room: 2}\n", }, body: `{"from":1,"dir":"east"}`, want: "other exits besides", @@ -329,10 +330,10 @@ func TestRemoveGuards(t *testing.T) { { name: "C does not lead back to B", rooms: map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n east: 4\n", - 4: "name: D\nexits:\n west: 3\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n east: {room: 4}\n", + 4: "name: D\nexits:\n west: {room: 3}\n", }, body: `{"from":1,"dir":"east"}`, want: "does not lead back to", @@ -363,12 +364,12 @@ func TestRemoveGridConflict(t *testing.T) { // to (1,0,0); 6 (at 3's old south neighbor (2,1,0)) follows to (1,1,0)? No // — the pull shifts the whole beyond-component; 6 lands on 5's cell (1,1,0). s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n south: 4\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n south: 6\n west: 2\n", - 4: "name: D\nexits:\n east: 5\n north: 1\n", - 5: "name: E\nexits:\n west: 4\n", - 6: "name: F\nexits:\n north: 3\n", + 1: "name: A\nexits:\n east: {room: 2}\n south: {room: 4}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n south: {room: 6}\n west: {room: 2}\n", + 4: "name: D\nexits:\n east: {room: 5}\n north: {room: 1}\n", + 5: "name: E\nexits:\n west: {room: 4}\n", + 6: "name: F\nexits:\n north: {room: 3}\n", }) resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`) if code != http.StatusConflict { @@ -394,10 +395,10 @@ func TestRemoveGridConflict(t *testing.T) { // room points into B, and that the message names the count. func TestRemoveExtraInbound(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n west: 2\n", - 9: "name: X\nexits:\n north: 2\n", // extra inbound edge into B + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", + 9: "name: X\nexits:\n north: {room: 2}\n", // extra inbound edge into B }) resp, code := postRemove(t, s, `{"from":1,"dir":"east"}`) if code != http.StatusBadRequest { @@ -418,12 +419,12 @@ func TestNextRoomIDNoCrossSubdirCollision(t *testing.T) { t.Fatal(err) } // Room 1 in root, room 2 in a subdirectory "zone". - writeRoomFile(t, dir, 1, "name: A\nexits:\n east: 2\n") + writeRoomFile(t, dir, 1, "name: A\nexits:\n east: {room: 2}\n") zoneDir := filepath.Join(roomsDir, "zone") if err := os.MkdirAll(zoneDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: 1\n"), 0o644); err != nil { + if err := os.WriteFile(filepath.Join(zoneDir, "2.yaml"), []byte("name: B\nexits:\n west: {room: 1}\n"), 0o644); err != nil { t.Fatal(err) } s := &AdminServer{ @@ -461,8 +462,8 @@ func testMobDef() *world.MobDef { // instances for the (now-deleted) new room, via rebuildAfterUndo's stat check. func TestUndoInsertClearsMobs(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n west: 1\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n west: {room: 1}\n", }) resp, code := postInsert(t, s, `{"from":1,"dir":"east","name":"Mid"}`) if code != http.StatusOK { @@ -471,7 +472,7 @@ func TestUndoInsertClearsMobs(t *testing.T) { newID := int(resp["room"].(map[string]any)["id"].(float64)) // Spawn a transient mob in the new room so the store has something to clear. - inst := s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, newID, "") + inst := s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, newID, "") if inst == nil { t.Fatal("SpawnTransient returned nil") } @@ -494,9 +495,9 @@ func TestUndoInsertClearsMobs(t *testing.T) { // for the re-deleted room. func TestRedoRemoveClearsMobs(t *testing.T) { s := newTestAdminServer(t, map[int]string{ - 1: "name: A\nexits:\n east: 2\n", - 2: "name: B\nexits:\n east: 3\n west: 1\n", - 3: "name: C\nexits:\n west: 2\n", + 1: "name: A\nexits:\n east: {room: 2}\n", + 2: "name: B\nexits:\n east: {room: 3}\n west: {room: 1}\n", + 3: "name: C\nexits:\n west: {room: 2}\n", }) if _, code := postRemove(t, s, `{"from":1,"dir":"east"}`); code != http.StatusOK { t.Fatal("remove failed") @@ -510,7 +511,7 @@ func TestRedoRemoveClearsMobs(t *testing.T) { if !roomExists(s, 2) { t.Fatal("precondition: B should exist after undo") } - s.mobStore.SpawnTransient(testMobDef(), &world.SpawnMobConfig{ID: "testmob"}, 2, "") + s.mobStore.SpawnTransient(testMobDef(), &behavior.SpawnMobConfig{ID: "testmob"}, 2, "") if got := len(s.mobStore.MobsInRoom(2)); got != 1 { t.Fatalf("precondition: expected 1 mob in B, got %d", got) } -- cgit v1.2.3