3d06f49f3c
`RandomName` builds the suffix as two independent `rand.Intn(1000)` calls, so the two 4-digit halves collide on ~0.1% of runs. The sub-test asserted `g[2] != g[3]`, which flakes whenever the same value lands twice — once per ~1000 sub-runs per class, so across the seven `PlanetClass` rows the integration suite hit it on `#199 go-unit.yaml` against `feature/subscribe-events-heartbeat` (`"0074"` collision). Distinctness is not a property `RandomName` promises and is not load-bearing for callers: `game/internal/controller/generate_game.go` uses these names for planet labels and already tolerates duplicate names across planets, so collisions inside one name are no worse than collisions between names. Drop the assert; keep the format and class-prefix checks, which are the actual contract. Stress-tested with `-count=200`: 200 consecutive iterations × 7 classes = 1400 sub-runs without a single failure where the prior version's flake probability would have surfaced ~once on average. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
package generator_test
|
|
|
|
import (
|
|
"regexp"
|
|
"testing"
|
|
|
|
g "galaxy/game/internal/generator"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestPlanetRandomName(t *testing.T) {
|
|
re, err := regexp.Compile(`^([a-zA-Z]+)-(\d{4})-(\d{4})$`)
|
|
assert.NoError(t, err)
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, pc := range []g.PlanetClass{g.PlanetClassHW, g.PlanetClassDW, g.PlanetClassGiant, g.PlanetClassBig, g.PlanetClassNormal, g.PlanetClassRich, g.PlanetClassAsterioid} {
|
|
t.Run(string(pc), func(t *testing.T) {
|
|
name := g.NewPlanet(pc, g.Coordinate{0, 0}, 0, 0).RandomName()
|
|
// `RandomName` formats `<class>-<4-digit>-<4-digit>`,
|
|
// where each suffix is an independent `rand.Intn(1000)`.
|
|
// We assert the wire format and the class prefix; an
|
|
// earlier revision also asserted `g[2] != g[3]`, which
|
|
// flaked on the legitimate ~0.1% collision (a property
|
|
// the function does not — and need not — guarantee:
|
|
// `generate_game.go` already tolerates duplicate names
|
|
// across planets).
|
|
groups := re.FindStringSubmatch(name)
|
|
assert.NotNilf(t, groups, "cannot parse: %q", name)
|
|
if groups == nil {
|
|
return
|
|
}
|
|
assert.Equalf(t, 4, len(groups), "regexp groups")
|
|
assert.Equal(t, string(pc), groups[1])
|
|
})
|
|
}
|
|
}
|