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) } } } // Every verb advertised in the help table must actually be a command. "farm" // was listed for a long time while not existing, so typing it returned // "Unknown command." A help entry is the first thing a new player trusts. func TestHelpCommandListMatchesRegistry(t *testing.T) { for _, entry := range commandList { for _, verb := range strings.Split(entry.Name, "/") { verb = strings.TrimSpace(verb) if verb == "" { continue } if _, ok := commandRegistry[verb]; ok { continue } if _, ok := verbAliases[verb]; ok { continue } t.Errorf("help lists %q (from %q) but it is not a registered command", verb, entry.Name) } } } // alwaysAvailable is a second hand-maintained verb list; it must not drift // from the registry either. func TestAlwaysAvailableCommandsAreRegistered(t *testing.T) { for _, verb := range alwaysAvailable { if _, ok := commandRegistry[verb]; !ok { t.Errorf("alwaysAvailable lists %q but it is not registered", verb) } } }