diff --git a/internal/model/game/fleet.go b/internal/model/game/fleet.go index c350f52..1da1415 100644 --- a/internal/model/game/fleet.go +++ b/internal/model/game/fleet.go @@ -69,7 +69,9 @@ func (g Game) joinShipGroupToFleetInternal(ri int, fleetName string, group, coun } } - if g.ShipGroups[sgi].Number != count && count > 0 { + if count > 0 && + g.ShipGroups[sgi].Number != count { + newGroup := g.ShipGroups[sgi] newGroup.Number -= count g.ShipGroups[sgi].Number = count diff --git a/internal/model/game/fleet_test.go b/internal/model/game/fleet_test.go new file mode 100644 index 0000000..10ec2a5 --- /dev/null +++ b/internal/model/game/fleet_test.go @@ -0,0 +1,7 @@ +package game_test + +import "testing" + +func TestJoinShipGroupToFleet(t *testing.T) { + +} diff --git a/internal/model/game/game_export_test.go b/internal/model/game/game_export_test.go index db843e5..672d45d 100644 --- a/internal/model/game/game_export_test.go +++ b/internal/model/game/game_export_test.go @@ -2,8 +2,8 @@ package game import "iter" -func (g *Game) CreateShips(ri int, shipTypeName string, planetNumber int, quantity int) error { - return g.createShips(ri, shipTypeName, planetNumber, quantity) +func (g *Game) CreateShips(ri int, shipTypeName string, planetNumber uint, quantity int) error { + return g.createShips(ri, shipTypeName, int(planetNumber), quantity) } func (g Game) ListShipGroups(ri int) iter.Seq2[int, ShipGroup] { diff --git a/internal/model/game/game_test.go b/internal/model/game/game_test.go new file mode 100644 index 0000000..860cc5b --- /dev/null +++ b/internal/model/game/game_test.go @@ -0,0 +1,73 @@ +package game_test + +import ( + "fmt" + + "github.com/google/uuid" + "github.com/iliadenisov/galaxy/internal/controller" + "github.com/iliadenisov/galaxy/internal/model/game" +) + +var ( + Race_0 = game.Race{ + ID: uuid.New(), + Name: "Race_0", + Drive: 1.1, + Weapons: 1.2, + Shields: 1.3, + Cargo: 1.4, + } + Race_1 = game.Race{ + ID: uuid.New(), + Name: "Race_1", + Drive: 2.1, + Weapons: 2.2, + Shields: 2.3, + Cargo: 2.4, + } + Map = game.Map{ + Width: 10, + Height: 10, + Planet: []game.Planet{ + controller.NewPlanet(R0_Planet_0_num, "Planet_0", Race_0.ID, 0, 0, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)), + controller.NewPlanet(R1_Planet_1_num, "Planet_1", Race_1.ID, 1, 1, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)), + controller.NewPlanet(R0_Planet_2_num, "Planet_2", Race_0.ID, 2, 2, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)), + }, + } + Game = &game.Game{ + Race: []game.Race{ + Race_0, + Race_1, + }, + Map: Map, + } + Race_0_idx = 0 + Race_0_Gunship = "R0_Gunship" + Race_0_Freighter = "R0_Freighter" + R0_Planet_0_num uint = 0 + R0_Planet_2_num uint = 2 + + Race_1_idx = 1 + Race_1_Gunship = "R1_Gunship" + Race_1_Freighter = "R1_Freighter" + R1_Planet_1_num uint = 1 +) + +func init() { + assertNoError(Game.CreateShipType(Race_0.Name, Race_0_Gunship, 60, 30, 100, 0, 3)) + assertNoError(Game.CreateShipType(Race_0.Name, Race_0_Freighter, 8, 0, 2, 10, 0)) + + assertNoError(Game.CreateShipType(Race_1.Name, Race_1_Gunship, 60, 30, 100, 0, 3)) + assertNoError(Game.CreateShipType(Race_1.Name, Race_1_Freighter, 8, 0, 2, 10, 0)) +} + +func assertNoError(err error) { + if err != nil { + panic(fmt.Sprintf("init assertion failed: %v", err)) + } +} + +func copyGame() *game.Game { + g := *Game + return &g +} diff --git a/internal/model/game/group_test.go b/internal/model/game/group_test.go index 7b57220..aa9cfde 100644 --- a/internal/model/game/group_test.go +++ b/internal/model/game/group_test.go @@ -7,7 +7,6 @@ import ( "testing" "github.com/google/uuid" - "github.com/iliadenisov/galaxy/internal/controller" e "github.com/iliadenisov/galaxy/internal/error" "github.com/iliadenisov/galaxy/internal/model/game" "github.com/stretchr/testify/assert" @@ -271,95 +270,53 @@ func TestShipGroupEqual(t *testing.T) { assert.True(t, left.Equal(right)) } -func TestJoinEqualGroups(t *testing.T) { - g := &game.Game{ - Race: make([]game.Race, 2), - } - raceIdx := 0 - g.Race[raceIdx] = game.Race{ - ID: uuid.New(), - Name: "Race_0", - Drive: 1.1, - Weapons: 1.2, - Shields: 1.3, - Cargo: 1.4, - } - g.Race[1] = game.Race{ - ID: uuid.New(), - Name: "Race_1", - Drive: 2.1, - Weapons: 2.2, - Shields: 2.3, - Cargo: 2.4, - } - g.Map = game.Map{ - Width: 10, - Height: 10, - Planet: make([]game.Planet, 3), - } - g.Map.Planet[0] = controller.NewPlanet(0, "Planet_0", g.Race[0].ID, 0, 0, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)) - g.Map.Planet[1] = controller.NewPlanet(1, "Planet_1", g.Race[1].ID, 1, 1, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)) - g.Map.Planet[2] = controller.NewPlanet(1, "Planet_2", g.Race[0].ID, 2, 2, 100, 0, 0, 0, game.ProductionNone.AsType(uuid.Nil)) +func TestCreateShips(t *testing.T) { + g := copyGame() + var err error - err := g.CreateShipType("Race_0", "R0_Gunship", 60, 30, 100, 0, 3) - assert.NoError(t, err) - err = g.CreateShipType("Race_0", "R0_Freighter", 8, 0, 2, 10, 0) - assert.NoError(t, err) - - err = g.CreateShipType("Race_1", "R1_Gunship", 60, 30, 100, 0, 3) - assert.NoError(t, err) - err = g.CreateShipType("Race_1", "R1_Freighter", 8, 0, 2, 10, 0) - assert.NoError(t, err) - - err = g.CreateShips(raceIdx, "Freighter", 0, 2) + err = g.CreateShips(Race_0_idx, "Unknown_Ship_Type", R0_Planet_0_num, 2) assert.ErrorContains(t, err, e.GenericErrorText(e.ErrInputEntityNotExists)) - err = g.CreateShips(raceIdx, "R0_Gunship", 1, 2) + err = g.CreateShips(Race_0_idx, Race_0_Gunship, R1_Planet_1_num, 2) assert.ErrorContains(t, err, e.GenericErrorText(e.ErrInputEntityNotOwned)) - err = g.CreateShips(raceIdx, "R0_Freighter", 0, 1) // 1 -> 2 - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 1) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 1)) + assert.Len(t, collectGroups(g.ListShipGroups(Race_0_idx)), 1) - err = g.CreateShips(1, "R1_Freighter", 1, 1) - assert.NoError(t, err) + assert.NoError(t, g.CreateShips(Race_1_idx, Race_1_Freighter, R1_Planet_1_num, 1)) assert.Len(t, collectGroups(g.ListShipGroups(1)), 1) - err = g.CreateShips(raceIdx, "R0_Freighter", 0, 6) // (2) - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 2) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 6)) + assert.Len(t, collectGroups(g.ListShipGroups(Race_0_idx)), 2) - err = g.CreateShips(raceIdx, "R0_Gunship", 0, 2) // (3) - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 3) - - err = g.CreateShips(1, "R1_Gunship", 1, 1) - assert.NoError(t, err) + assert.NoError(t, g.CreateShips(Race_1_idx, Race_1_Gunship, R1_Planet_1_num, 1)) assert.Len(t, collectGroups(g.ListShipGroups(1)), 2) +} - g.Race[raceIdx].Drive = 1.5 - err = g.CreateShips(raceIdx, "R0_Gunship", 0, 9) // 4 -> 6 - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 4) - err = g.CreateShips(raceIdx, "R0_Freighter", 0, 7) // 5 -> 7 - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 5) - err = g.CreateShips(raceIdx, "R0_Gunship", 0, 4) // (6) - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 6) - err = g.CreateShips(raceIdx, "R0_Freighter", 0, 4) // (7) - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 7) +func TestJoinEqualGroups(t *testing.T) { + g := copyGame() - g.Race[1].Shields = 2.0 - err = g.CreateShips(1, "R1_Freighter", 1, 1) - assert.NoError(t, err) - assert.Len(t, collectGroups(g.ListShipGroups(1)), 3) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 1)) // 1 -> 2 + assert.NoError(t, g.CreateShips(Race_1_idx, Race_1_Freighter, R1_Planet_1_num, 1)) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 6)) // (2) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Gunship, R0_Planet_0_num, 2)) // (3) + assert.NoError(t, g.CreateShips(Race_1_idx, Race_1_Gunship, R1_Planet_1_num, 1)) - err = g.JoinEqualGroups("Race_0") - assert.NoError(t, err) + g.Race[Race_0_idx].Drive = 1.5 + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Gunship, R0_Planet_0_num, 9)) // 4 -> 6 + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 7)) // 5 -> 7 + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Gunship, R0_Planet_0_num, 4)) // (6) + assert.NoError(t, g.CreateShips(Race_0_idx, Race_0_Freighter, R0_Planet_0_num, 4)) // (7) - assert.Len(t, collectGroups(g.ListShipGroups(1)), 3) - assert.Len(t, collectGroups(g.ListShipGroups(raceIdx)), 4) + assert.Len(t, collectGroups(g.ListShipGroups(Race_0_idx)), 7) + + g.Race[Race_1_idx].Shields = 2.0 + assert.NoError(t, g.CreateShips(1, Race_1_Freighter, R1_Planet_1_num, 1)) + assert.Len(t, collectGroups(g.ListShipGroups(Race_1_idx)), 3) + + assert.NoError(t, g.JoinEqualGroups(Race_0.Name)) + + assert.Len(t, collectGroups(g.ListShipGroups(Race_1_idx)), 3) + assert.Len(t, collectGroups(g.ListShipGroups(Race_0_idx)), 4) shipTypeID := func(ri int, name string) uuid.UUID { st := slices.IndexFunc(g.Race[ri].ShipTypes, func(v game.ShipType) bool { return v.Name == name }) @@ -370,18 +327,18 @@ func TestJoinEqualGroups(t *testing.T) { return g.Race[ri].ShipTypes[st].ID } - for _, sg := range g.ListShipGroups(raceIdx) { + for _, sg := range g.ListShipGroups(Race_0_idx) { switch { - case sg.TypeID == shipTypeID(raceIdx, "R0_Freighter") && sg.Drive == 1.1: + case sg.TypeID == shipTypeID(Race_0_idx, Race_0_Freighter) && sg.Drive == 1.1: assert.Equal(t, uint(7), sg.Number) assert.Equal(t, uint(2), sg.Index) - case sg.TypeID == shipTypeID(raceIdx, "R0_Freighter") && sg.Drive == 1.5: + case sg.TypeID == shipTypeID(Race_0_idx, Race_0_Freighter) && sg.Drive == 1.5: assert.Equal(t, uint(11), sg.Number) assert.Equal(t, uint(7), sg.Index) - case sg.TypeID == shipTypeID(raceIdx, "R0_Gunship") && sg.Drive == 1.1: + case sg.TypeID == shipTypeID(Race_0_idx, Race_0_Gunship) && sg.Drive == 1.1: assert.Equal(t, uint(2), sg.Number) assert.Equal(t, uint(3), sg.Index) - case sg.TypeID == shipTypeID(raceIdx, "R0_Gunship") && sg.Drive == 1.5: + case sg.TypeID == shipTypeID(Race_0_idx, Race_0_Gunship) && sg.Drive == 1.5: assert.Equal(t, uint(13), sg.Number) assert.Equal(t, uint(6), sg.Index) default: