aboutsummaryrefslogtreecommitdiff
path: root/internal/validate/grid_test.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-06-27 16:50:41 -0400
committerhistoria <[not public]>2026-06-27 16:50:41 -0400
commit988b006a5bb9edb6465653566e7bdf8175347b8c (patch)
tree3a1fceff2ee80c11b5dafcc49c13ababe021e880 /internal/validate/grid_test.go
parent1cab9ca20e24742f770a676f84e4ed9f1636f297 (diff)
downloadthehouseoficarus-988b006a5bb9edb6465653566e7bdf8175347b8c.tar.gz
feat: one-way map links, blocked paths on map, map grid startup validation, user colors for maps
Diffstat (limited to 'internal/validate/grid_test.go')
-rw-r--r--internal/validate/grid_test.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/internal/validate/grid_test.go b/internal/validate/grid_test.go
new file mode 100644
index 0000000..9a8ef02
--- /dev/null
+++ b/internal/validate/grid_test.go
@@ -0,0 +1,105 @@
+package validate
+
+import (
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "testing"
+
+ "thehouseoficarus/internal/world"
+)
+
+func writeGridRoom(t *testing.T, dir string, id int, body string) {
+ t.Helper()
+ rooms := filepath.Join(dir, "rooms")
+ if err := os.MkdirAll(rooms, 0o755); err != nil {
+ t.Fatal(err)
+ }
+ if err := os.WriteFile(filepath.Join(rooms, strconv.Itoa(id)+".yaml"), []byte(body), 0o644); err != nil {
+ t.Fatal(err)
+ }
+}
+
+func runGridCheck(t *testing.T, rooms map[int]string, roots ...int) []Issue {
+ t.Helper()
+ dir := t.TempDir()
+ for id, body := range rooms {
+ writeGridRoom(t, dir, id, body)
+ }
+ return validateRoomGrid(Source{World: world.New(dir), RootRooms: roots})
+}
+
+func containsMsg(issues []Issue, substr string) bool {
+ for _, iss := range issues {
+ if strings.Contains(iss.Message, substr) {
+ return true
+ }
+ }
+ return false
+}
+
+func TestGridCleanLayout(t *testing.T) {
+ // A consistent 2x2 block: 4 is reached the same way from 2 and from 3.
+ rooms := map[int]string{
+ 1: "exits:\n south: 3\n east: 2\n",
+ 2: "exits:\n south: 4\n",
+ 3: "exits:\n east: 4\n",
+ 4: "name: corner\n",
+ }
+ if issues := runGridCheck(t, rooms, 1); len(issues) != 0 {
+ t.Errorf("expected no grid issues, got: %+v", issues)
+ }
+}
+
+func TestGridOverlap(t *testing.T) {
+ // rooms 4 and 5 both resolve to grid (1,1).
+ rooms := map[int]string{
+ 1: "exits:\n south: 3\n east: 2\n",
+ 2: "exits:\n south: 5\n",
+ 3: "exits:\n east: 4\n",
+ 4: "name: four\n",
+ 5: "name: five\n",
+ }
+ issues := runGridCheck(t, rooms, 1)
+ if !containsMsg(issues, "Grid overlap") {
+ t.Errorf("expected a grid overlap, got: %+v", issues)
+ }
+ for _, iss := range issues {
+ if iss.Level != "ERROR" {
+ t.Errorf("grid issues should be ERROR, got %q", iss.Level)
+ }
+ }
+}
+
+func TestGridTwist(t *testing.T) {
+ // room 3 is forced onto two different cells.
+ rooms := map[int]string{
+ 1: "exits:\n south: 4\n east: 2\n",
+ 2: "exits:\n east: 3\n",
+ 4: "exits:\n east: 3\n",
+ 3: "name: three\n",
+ }
+ issues := runGridCheck(t, rooms, 1)
+ if !containsMsg(issues, "Grid twist") {
+ t.Errorf("expected a grid twist, got: %+v", issues)
+ }
+}
+
+func TestGridMultiPlaneViaUpDown(t *testing.T) {
+ // Plane A is just room 1. Going up seeds plane B (origin 10), which has an
+ // overlap. This proves up/down crosses planes and frames are independent
+ // (room 1 and room 10 both sit at (0,0) without conflicting).
+ rooms := map[int]string{
+ 1: "exits:\n up: 10\n",
+ 10: "exits:\n south: 12\n east: 11\n",
+ 11: "exits:\n south: 14\n",
+ 12: "exits:\n east: 13\n",
+ 13: "name: thirteen\n",
+ 14: "name: fourteen\n",
+ }
+ issues := runGridCheck(t, rooms, 1)
+ if !containsMsg(issues, "plane origin 10") {
+ t.Errorf("expected an overlap in plane origin 10, got: %+v", issues)
+ }
+}