package domain import "testing" func TestRatingsAndCaptainInvariants(t *testing.T) { if err := (Ratings{Tank: 1, Damage: 40, Support: 20}).Validate(); err != nil { t.Fatal(err) } if err := (Ratings{Tank: 0, Damage: 20, Support: 20}).Validate(); err == nil { t.Fatal("expected invalid rating") } team := Team{Slots: []Slot{{PlayerID: "p1", Role: Tank}}} if err := team.AssignCaptain("outsider"); err == nil { t.Fatal("outsider was assigned captain") } if err := team.AssignCaptain("p1"); err != nil || team.CaptainPlayerID != "p1" { t.Fatalf("valid captain rejected: %v", err) } } func TestPlayerPreferenceLimits(t *testing.T) { player := Player{ID: "p1", PreferredRoles: []Role{Tank, Support}, PreferredPlayerIDs: []string{"p2", "p3", "p4"}} if err := player.ValidatePreferences(); err != nil { t.Fatal(err) } player.PreferredPlayerIDs = append(player.PreferredPlayerIDs, "p5") if err := player.ValidatePreferences(); err == nil { t.Fatal("expected teammate preference limit") } } func TestSeriesBestOfThree(t *testing.T) { s := Series{TeamAID: "a", TeamBID: "b", BestOf: 3} for _, outcome := range []MapOutcome{TeamAWin, Draw, TeamAWin} { if err := s.RecordResult(MapResult{MapName: "map", Outcome: outcome}); err != nil { t.Fatal(err) } } if s.WinnerTeamID != "a" || s.Version != 3 { t.Fatalf("unexpected completed series: %+v", s) } if err := s.RecordResult(MapResult{MapName: "late", Outcome: TeamBWin}); err == nil { t.Fatal("accepted result after completion") } } func TestSeriesResultCorrectionPreservesHistoryAndRecalculatesWinner(t *testing.T) { s := Series{TeamAID: "a", TeamBID: "b", BestOf: 3} _ = s.RecordResult(MapResult{MapName: "one", Outcome: TeamAWin}) _ = s.RecordResult(MapResult{MapName: "two", Outcome: TeamAWin}) if s.WinnerTeamID != "a" { t.Fatal("series should initially be won by team A") } if err := s.CorrectResult(1, MapResult{MapName: "two", Outcome: TeamBWin}); err != nil { t.Fatal(err) } if s.WinnerTeamID != "" || len(s.Results) != 3 || s.Results[2].CorrectionOf != 2 { t.Fatalf("unexpected corrected series: %+v", s) } }