diff --git a/model/alliance_team.go b/model/alliance_team.go index 64379b2..8ece2d1 100644 --- a/model/alliance_team.go +++ b/model/alliance_team.go @@ -72,3 +72,42 @@ func (database *Database) GetAllAlliances() ([][]AllianceTeam, error) { } return alliances, nil } + +// Returns two arrays containing the IDs of any teams for the red and blue alliances, respectively, who are part of the +// elimination alliance but are not playing in the given match. +// If the given match isn't an elimination match, empty arrays are returned. +func (database *Database) GetOffFieldTeamIds(match *Match) ([]int, []int, error) { + redOffFieldTeams, err := database.getOffFieldTeamIdsForAlliance( + match.ElimRedAlliance, match.Red1, match.Red2, match.Red3, + ) + if err != nil { + return nil, nil, err + } + + blueOffFieldTeams, err := database.getOffFieldTeamIdsForAlliance( + match.ElimBlueAlliance, match.Blue1, match.Blue2, match.Blue3, + ) + if err != nil { + return nil, nil, err + } + + return redOffFieldTeams, blueOffFieldTeams, nil +} + +func (database *Database) getOffFieldTeamIdsForAlliance(allianceId int, teamId1, teamId2, teamId3 int) ([]int, error) { + if allianceId == 0 { + return []int{}, nil + } + + allianceTeams, err := database.GetTeamsByAlliance(allianceId) + if err != nil { + return nil, err + } + offFieldTeamIds := []int{} + for _, allianceTeam := range allianceTeams { + if allianceTeam.TeamId != teamId1 && allianceTeam.TeamId != teamId2 && allianceTeam.TeamId != teamId3 { + offFieldTeamIds = append(offFieldTeamIds, allianceTeam.TeamId) + } + } + return offFieldTeamIds, nil +} diff --git a/model/alliance_team_test.go b/model/alliance_team_test.go index 822b172..ce63761 100644 --- a/model/alliance_team_test.go +++ b/model/alliance_team_test.go @@ -48,17 +48,19 @@ func TestGetTeamsByAlliance(t *testing.T) { BuildTestAlliances(db) allianceTeams, err := db.GetTeamsByAlliance(1) assert.Nil(t, err) - if assert.Equal(t, 4, len(allianceTeams)) { + if assert.Equal(t, 5, len(allianceTeams)) { assert.Equal(t, 254, allianceTeams[0].TeamId) assert.Equal(t, 469, allianceTeams[1].TeamId) assert.Equal(t, 2848, allianceTeams[2].TeamId) assert.Equal(t, 74, allianceTeams[3].TeamId) + assert.Equal(t, 3175, allianceTeams[4].TeamId) } allianceTeams, err = db.GetTeamsByAlliance(2) assert.Nil(t, err) - if assert.Equal(t, 2, len(allianceTeams)) { + if assert.Equal(t, 3, len(allianceTeams)) { assert.Equal(t, 1718, allianceTeams[0].TeamId) assert.Equal(t, 2451, allianceTeams[1].TeamId) + assert.Equal(t, 1619, allianceTeams[2].TeamId) } } @@ -86,15 +88,68 @@ func TestGetAllAlliances(t *testing.T) { alliances, err = db.GetAllAlliances() assert.Nil(t, err) if assert.Equal(t, 2, len(alliances)) { - if assert.Equal(t, 4, len(alliances[0])) { + if assert.Equal(t, 5, len(alliances[0])) { assert.Equal(t, 254, alliances[0][0].TeamId) assert.Equal(t, 469, alliances[0][1].TeamId) assert.Equal(t, 2848, alliances[0][2].TeamId) assert.Equal(t, 74, alliances[0][3].TeamId) + assert.Equal(t, 3175, alliances[0][4].TeamId) } - if assert.Equal(t, 2, len(alliances[1])) { + if assert.Equal(t, 3, len(alliances[1])) { assert.Equal(t, 1718, alliances[1][0].TeamId) assert.Equal(t, 2451, alliances[1][1].TeamId) + assert.Equal(t, 1619, alliances[1][2].TeamId) } } } + +func TestGetOffFieldTeamIds(t *testing.T) { + db := setupTestDb(t) + defer db.Close() + BuildTestAlliances(db) + + match := &Match{ + ElimRedAlliance: 1, + ElimBlueAlliance: 2, + Red1: 469, + Red2: 254, + Red3: 2848, + Blue1: 1619, + Blue2: 1718, + Blue3: 2451, + } + + redOffFieldTeams, blueOffFieldTeams, err := db.GetOffFieldTeamIds(match) + assert.Nil(t, err) + assert.Equal(t, []int{74, 3175}, redOffFieldTeams) + assert.Equal(t, []int{}, blueOffFieldTeams) + + match.Red1 = 74 + match.Red2 = 3175 + redOffFieldTeams, blueOffFieldTeams, err = db.GetOffFieldTeamIds(match) + assert.Nil(t, err) + assert.Equal(t, []int{254, 469}, redOffFieldTeams) + assert.Equal(t, []int{}, blueOffFieldTeams) + + match.ElimRedAlliance = 0 + match.ElimBlueAlliance = 0 + redOffFieldTeams, blueOffFieldTeams, err = db.GetOffFieldTeamIds(match) + assert.Nil(t, err) + assert.Equal(t, []int{}, redOffFieldTeams) + assert.Equal(t, []int{}, blueOffFieldTeams) + + match = &Match{ + ElimRedAlliance: 2, + ElimBlueAlliance: 1, + Red1: 1718, + Red2: 2451, + Red3: 1619, + Blue1: 3175, + Blue2: 74, + Blue3: 2848, + } + redOffFieldTeams, blueOffFieldTeams, err = db.GetOffFieldTeamIds(match) + assert.Nil(t, err) + assert.Equal(t, []int{}, redOffFieldTeams) + assert.Equal(t, []int{254, 469}, blueOffFieldTeams) +} diff --git a/model/test_helpers.go b/model/test_helpers.go index 6a5604f..c484c63 100755 --- a/model/test_helpers.go +++ b/model/test_helpers.go @@ -36,5 +36,7 @@ func BuildTestAlliances(database *Database) { database.CreateAllianceTeam(&AllianceTeam{0, 1, 1, 469}) database.CreateAllianceTeam(&AllianceTeam{0, 1, 0, 254}) database.CreateAllianceTeam(&AllianceTeam{0, 1, 2, 2848}) + database.CreateAllianceTeam(&AllianceTeam{0, 2, 2, 1619}) database.CreateAllianceTeam(&AllianceTeam{0, 2, 1, 2451}) + database.CreateAllianceTeam(&AllianceTeam{0, 1, 4, 3175}) } diff --git a/partner/tba_test.go b/partner/tba_test.go index a3b587c..9074f25 100644 --- a/partner/tba_test.go +++ b/partner/tba_test.go @@ -96,8 +96,11 @@ func TestPublishAlliances(t *testing.T) { tbaServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var reader bytes.Buffer reader.ReadFrom(r.Body) - assert.Equal(t, "[[\"frc254\",\"frc469\",\"frc2848\",\"frc74\"],[\"frc1718\",\"frc2451\"]]", - reader.String()) + assert.Equal( + t, + "[[\"frc254\",\"frc469\",\"frc2848\",\"frc74\",\"frc3175\"],[\"frc1718\",\"frc2451\",\"frc1619\"]]", + reader.String(), + ) })) defer tbaServer.Close() client := NewTbaClient("my_event_code", "my_secret_id", "my_secret") diff --git a/templates/match_play.html b/templates/match_play.html index b8ab4b1..22d5d46 100755 --- a/templates/match_play.html +++ b/templates/match_play.html @@ -73,6 +73,14 @@ {{template "matchPlayTeam" dict "team" .Match.Blue1 "color" "B" "position" 1 "data" .}} {{template "matchPlayTeam" dict "team" .Match.Blue2 "color" "B" "position" 2 "data" .}} {{template "matchPlayTeam" dict "team" .Match.Blue3 "color" "B" "position" 3 "data" .}} + {{if eq .Match.Type "elimination" }} +