mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 13:46:44 -04:00
Add field to Ranking model to track previous rank.
This commit is contained in:
@@ -13,10 +13,10 @@ import (
|
||||
)
|
||||
|
||||
// Determines the rankings from the stored match results, and saves them to the database.
|
||||
func CalculateRankings(database *model.Database) error {
|
||||
func CalculateRankings(database *model.Database, preservePreviousRank bool) (game.Rankings, error) {
|
||||
matches, err := database.GetMatchesByType("qualification")
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
rankings := make(map[int]*game.Ranking)
|
||||
for _, match := range matches {
|
||||
@@ -25,7 +25,7 @@ func CalculateRankings(database *model.Database) error {
|
||||
}
|
||||
matchResult, err := database.GetMatchResultForMatch(match.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
if !match.Red1IsSurrogate {
|
||||
addMatchResultToRankings(rankings, match.Red1, matchResult, true)
|
||||
@@ -47,16 +47,33 @@ func CalculateRankings(database *model.Database) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve old rankings so that we can display changes in rank as a result of this calculation.
|
||||
oldRankings, err := database.GetAllRankings()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
oldRankingsMap := make(map[int]game.Ranking, len(oldRankings))
|
||||
for _, ranking := range oldRankings {
|
||||
oldRankingsMap[ranking.TeamId] = ranking
|
||||
}
|
||||
|
||||
sortedRankings := sortRankings(rankings)
|
||||
for rank, ranking := range sortedRankings {
|
||||
ranking.Rank = rank + 1
|
||||
sortedRankings[rank].Rank = rank + 1
|
||||
if oldRank, ok := oldRankingsMap[ranking.TeamId]; ok {
|
||||
if preservePreviousRank {
|
||||
sortedRankings[rank].PreviousRank = oldRank.PreviousRank
|
||||
} else {
|
||||
sortedRankings[rank].PreviousRank = oldRank.Rank
|
||||
}
|
||||
}
|
||||
}
|
||||
err = database.ReplaceAllRankings(sortedRankings)
|
||||
if err != nil {
|
||||
return nil
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil
|
||||
return sortedRankings, nil
|
||||
}
|
||||
|
||||
// Checks all the match results for yellow and red cards, and updates the team model accordingly.
|
||||
@@ -140,7 +157,7 @@ func addMatchResultToRankings(rankings map[int]*game.Ranking, teamId int, matchR
|
||||
func sortRankings(rankings map[int]*game.Ranking) game.Rankings {
|
||||
var sortedRankings game.Rankings
|
||||
for _, ranking := range rankings {
|
||||
sortedRankings = append(sortedRankings, ranking)
|
||||
sortedRankings = append(sortedRankings, *ranking)
|
||||
}
|
||||
sort.Sort(sortedRankings)
|
||||
return sortedRankings
|
||||
|
||||
@@ -13,17 +13,24 @@ func TestCalculateRankings(t *testing.T) {
|
||||
database := setupTestDb(t)
|
||||
|
||||
setupMatchResultsForRankings(database)
|
||||
err := CalculateRankings(database)
|
||||
updatedRankings, err := CalculateRankings(database, false)
|
||||
assert.Nil(t, err)
|
||||
rankings, err := database.GetAllRankings()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, updatedRankings, rankings)
|
||||
if assert.Equal(t, 6, len(rankings)) {
|
||||
assert.Equal(t, 4, rankings[0].TeamId)
|
||||
assert.Equal(t, 0, rankings[0].PreviousRank)
|
||||
assert.Equal(t, 5, rankings[1].TeamId)
|
||||
assert.Equal(t, 0, rankings[1].PreviousRank)
|
||||
assert.Equal(t, 6, rankings[2].TeamId)
|
||||
assert.Equal(t, 0, rankings[2].PreviousRank)
|
||||
assert.Equal(t, 1, rankings[3].TeamId)
|
||||
assert.Equal(t, 0, rankings[3].PreviousRank)
|
||||
assert.Equal(t, 3, rankings[4].TeamId)
|
||||
assert.Equal(t, 0, rankings[4].PreviousRank)
|
||||
assert.Equal(t, 2, rankings[5].TeamId)
|
||||
assert.Equal(t, 0, rankings[5].PreviousRank)
|
||||
}
|
||||
|
||||
// Test after changing a match result.
|
||||
@@ -31,17 +38,47 @@ func TestCalculateRankings(t *testing.T) {
|
||||
matchResult3.RedScore, matchResult3.BlueScore = matchResult3.BlueScore, matchResult3.RedScore
|
||||
err = database.CreateMatchResult(matchResult3)
|
||||
assert.Nil(t, err)
|
||||
err = CalculateRankings(database)
|
||||
updatedRankings, err = CalculateRankings(database, false)
|
||||
assert.Nil(t, err)
|
||||
rankings, err = database.GetAllRankings()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, updatedRankings, rankings)
|
||||
if assert.Equal(t, 6, len(rankings)) {
|
||||
assert.Equal(t, 6, rankings[0].TeamId)
|
||||
assert.Equal(t, 3, rankings[0].PreviousRank)
|
||||
assert.Equal(t, 5, rankings[1].TeamId)
|
||||
assert.Equal(t, 2, rankings[1].PreviousRank)
|
||||
assert.Equal(t, 4, rankings[2].TeamId)
|
||||
assert.Equal(t, 1, rankings[2].PreviousRank)
|
||||
assert.Equal(t, 1, rankings[3].TeamId)
|
||||
assert.Equal(t, 4, rankings[3].PreviousRank)
|
||||
assert.Equal(t, 3, rankings[4].TeamId)
|
||||
assert.Equal(t, 5, rankings[4].PreviousRank)
|
||||
assert.Equal(t, 2, rankings[5].TeamId)
|
||||
assert.Equal(t, 6, rankings[5].PreviousRank)
|
||||
}
|
||||
|
||||
matchResult3 = model.BuildTestMatchResult(3, 4)
|
||||
err = database.CreateMatchResult(matchResult3)
|
||||
assert.Nil(t, err)
|
||||
updatedRankings, err = CalculateRankings(database, true)
|
||||
assert.Nil(t, err)
|
||||
rankings, err = database.GetAllRankings()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, updatedRankings, rankings)
|
||||
if assert.Equal(t, 6, len(rankings)) {
|
||||
assert.Equal(t, 4, rankings[0].TeamId)
|
||||
assert.Equal(t, 1, rankings[0].PreviousRank)
|
||||
assert.Equal(t, 5, rankings[1].TeamId)
|
||||
assert.Equal(t, 2, rankings[1].PreviousRank)
|
||||
assert.Equal(t, 1, rankings[2].TeamId)
|
||||
assert.Equal(t, 4, rankings[2].PreviousRank)
|
||||
assert.Equal(t, 3, rankings[3].TeamId)
|
||||
assert.Equal(t, 5, rankings[3].PreviousRank)
|
||||
assert.Equal(t, 6, rankings[4].TeamId)
|
||||
assert.Equal(t, 3, rankings[4].PreviousRank)
|
||||
assert.Equal(t, 2, rankings[5].TeamId)
|
||||
assert.Equal(t, 6, rankings[5].PreviousRank)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user