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) { for i, m := range monsterTable { if len(m.Stats.Dmg) == 0 { t.Errorf("monster %c (%s) has no attacks", 'A'+i, m.Name) } } for w, iw := range initWeaps { if len(iw.dam) == 0 || len(iw.hrl) == 0 { t.Errorf("weapon %v has empty dice", WeaponKind(w)) } } }