gochecknoglobals: all 37 package-level tables consolidated into the gameData struct (game/tables.go), built by newGameData() and carried on RogueGame as g.data (set in NewGame and Restore). ObjectKind Glyph()/objectKindForGlyph are now switches; the table-reading subtype Stringer methods are gone; isMagic is a RogueGame method. goconst: repeated words named (potionName/scrollName/ringName/goldName in object.go, wandName/staffName in sticks.go, ripWall in tables.go). exhaustive, testpackage: disabled in .golangci.yml with sneak's approval (2026-07-07). Also reverts misspell's silent corruption of the "ther" scroll-name syllable (it had become "there", changing generated scroll names vs C). Remaining red: cyclop/gocognit/nestif until refactor step 7; mnd awaits a ruling. TODO.md rotated; MEMORY.md lint notes updated.
48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
package game
|
|
|
|
import "testing"
|
|
|
|
// ParseDice must keep the exact semantics of the C roll_em parse loop,
|
|
// including its junk-tolerant edges: the bestiary placeholder "%%%x0" and
|
|
// the flytrap reset "000x0" both mean a single 0x0 attack.
|
|
func TestParseDice(t *testing.T) {
|
|
cases := []struct {
|
|
in string
|
|
want string
|
|
len int
|
|
}{
|
|
{"1x4", "1x4", 1},
|
|
{"1x2/1x5/1x5", "1x2/1x5/1x5", 3},
|
|
{"2x12/2x4", "2x12/2x4", 2},
|
|
{"0x0", "0x0", 1},
|
|
{"000x0", "0x0", 1},
|
|
{"%%%x0", "0x0", 1},
|
|
{"", "", 0},
|
|
{"3", "", 0}, // no 'x': C parses nothing
|
|
}
|
|
for _, c := range cases {
|
|
got := ParseDice(c.in)
|
|
if len(got) != c.len || got.String() != c.want {
|
|
t.Errorf("ParseDice(%q) = %v (len %d), want %q (len %d)",
|
|
c.in, got, len(got), c.want, c.len)
|
|
}
|
|
}
|
|
}
|
|
|
|
// The bestiary and weapon tables must parse to at least one attack each so
|
|
// every creature and weapon actually swings.
|
|
func TestTablesHaveDice(t *testing.T) {
|
|
data := newGameData()
|
|
for i, m := range data.monsterTable {
|
|
if len(m.Stats.Dmg) == 0 {
|
|
t.Errorf("monster %c (%s) has no attacks", 'A'+i, m.Name)
|
|
}
|
|
}
|
|
|
|
for w, iw := range data.initWeaps {
|
|
if len(iw.dam) == 0 || len(iw.hrl) == 0 {
|
|
t.Errorf("weapon %d has empty dice", w)
|
|
}
|
|
}
|
|
}
|