package game import ( "strings" "testing" "thirdcollapse/internal/world" ) func TestBuildTinyMap(t *testing.T) { g := &Game{ World: world.New("../../data"), MapWidth: 70, } tests := []struct { name string roomID int want []string // expected lines, or nil to just check count }{ { name: "room 1 has east exit", roomID: 1, }, { name: "room 2 has west/north/east", roomID: 2, }, { name: "room 4 has west/north/east", roomID: 4, }, { name: "room 21 has west only", roomID: 21, }, { name: "room 22 west of town square", roomID: 22, }, { name: "room 25 east of south of west", roomID: 25, }, { name: "room 8 hacking lab", roomID: 8, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { lines := buildTinyMap(g, tt.roomID) if len(lines) != 7 { t.Fatalf("expected 7 lines, got %d", len(lines)) } if lines[0] != "╔═════╗" { t.Errorf("line 0: want ╔═════╗, got %s", lines[0]) } if lines[6] != "╚═════╝" { t.Errorf("line 6: want ╚═════╝, got %s", lines[6]) } for i := 1; i <= 5; i++ { if !strings.HasPrefix(lines[i], "║") || !strings.HasSuffix(lines[i], "║") { t.Errorf("line %d: should have ║ borders, got %s", i, lines[i]) } if len([]rune(lines[i])) != 7 { t.Errorf("line %d: expected 7 runes, got %d in %q", i, len([]rune(lines[i])), lines[i]) } } t.Logf("Room %d map:\n%s", tt.roomID, strings.Join(lines, "\n")) }) } } func TestWrapText(t *testing.T) { tests := []struct { text string width int want int // expected number of lines }{ {"hello world", 70, 1}, {"hello world", 5, 2}, {"", 70, 0}, {"a b c d e f g h i j", 5, 4}, } for _, tt := range tests { result := wrapText(tt.text, tt.width) if len(result) != tt.want { t.Errorf("wrapText(%q, %d) = %d lines, want %d: %v", tt.text, tt.width, len(result), tt.want, result) } } }