package game_test import ( "fmt" "testing" "github.com/iliadenisov/galaxy/internal/controller" "github.com/iliadenisov/galaxy/internal/game" mg "github.com/iliadenisov/galaxy/internal/model/game" "github.com/iliadenisov/galaxy/internal/util" "github.com/stretchr/testify/assert" ) const ( testRaceCount = 20 unknownRaceName = "Race_RIP" ) func raceNum(i int) string { return fmt.Sprintf("race_%02d", i) } func TestComposeGame(t *testing.T) { g(t, func(p func(*controller.Param), g func() *mg.Game) { _, err := game.GenerateGame(p, []string{"r1", "r2"}) assert.Error(t, err) assert.ErrorContains(t, err, "turn 0 already saved at 0000/state.json") }) } func g(t *testing.T, f func(p func(*controller.Param), g func() *mg.Game)) { root, cleanup := util.CreateWorkDir(t) defer cleanup() races := make([]string, testRaceCount) for i := range testRaceCount { races[i] = raceNum(i) } p := func(p *controller.Param) { p.StoragePath = root } _, err := game.GenerateGame(p, races) if err != nil { assert.FailNow(t, "g: ComposeGame", err) return } g := func() *mg.Game { g, err := game.LoadState(p) if err != nil { assert.FailNow(t, "g: LoadState", err) return nil } return g } f(p, g) } func c(t *testing.T, f func(p func(*controller.Param), g func() *controller.Controller)) { root, cleanup := util.CreateWorkDir(t) defer cleanup() races := make([]string, testRaceCount) for i := range testRaceCount { races[i] = raceNum(i) } p := func(p *controller.Param) { p.StoragePath = root } _, err := game.GenerateGame(p, races) if err != nil { assert.FailNow(t, "c: GenerateGame", err) return } ctl := func() *controller.Controller { c, err := controller.NewController(p) if err != nil { assert.FailNow(t, "c: NewController", err) return nil } g, err := game.LoadState(p) if err != nil { assert.FailNow(t, "c: LoadState", err) return nil } c.Cache = controller.NewCache(g) return c } f(p, ctl) }