package game import ( "strings" "testing" ) func loadHelpOrSkip(t *testing.T) []HelpDef { t.Helper() helps, err := LoadHelp("../../data") if err != nil { t.Fatal(err) } if len(helps) == 0 { t.Fatal("no help topics loaded") } return helps } func TestLoadHelpAllFilesParse(t *testing.T) { helps := loadHelpOrSkip(t) seen := map[string]bool{} for _, h := range helps { if strings.TrimSpace(h.Name) == "" { t.Errorf("help entry with empty name: %q", h.Content) } if seen[h.Name] { t.Errorf("duplicate help topic %q", h.Name) } seen[h.Name] = true } } func TestNewPlayerHelpExists(t *testing.T) { helps := loadHelpOrSkip(t) found := false for _, h := range helps { if h.Name == "newplayer" { found = true } } if !found { t.Fatal("help topic 'newplayer' missing (referenced by intro room)") } } func TestHelpAliasesResolveWithoutCollision(t *testing.T) { helps := loadHelpOrSkip(t) owner := map[string]string{} for _, h := range helps { for _, a := range h.Aliases { a = strings.ToLower(strings.TrimSpace(a)) if a == "" { continue } if prev, dup := owner[a]; dup { t.Errorf("alias %q claimed by both %q and %q", a, prev, h.Name) } owner[a] = h.Name } } for topic, want := range map[string]string{ "mine": "mining", "chop": "woodcutting", "fish": "fishing", "fletch": "fletch", "newplayer": "newplayer", "new player": "newplayer", } { resolved := "" for _, h := range helps { if matchesHelpTopic(h, topic) { resolved = h.Name break } } if resolved != want { t.Errorf("help %q resolved to %q, want %q", topic, resolved, want) } } }