package domain import ( "fmt" "testing" ) func rankedParticipants() []RankedParticipant { result := make([]RankedParticipant, 6) for i := range result { result[i] = RankedParticipant{PlayerID: string(rune('a' + i)), SteamID: string(rune('A' + i))} } return result } func TestRankedAdmissionRequiresSixUniqueVerifiedSoloHumansAndEligibleArena(t *testing.T) { if err := ValidateRankedAdmission(rankedParticipants(), DefaultRankedArena()); err != nil { t.Fatal(err) } cases := []struct { name string edit func([]RankedParticipant, *RankedArena) }{ {"five players", func(p []RankedParticipant, _ *RankedArena) { p[5].PlayerID = "" }}, {"party", func(p []RankedParticipant, _ *RankedArena) { p[0].PartyID = "party-1" }}, {"bot", func(p []RankedParticipant, _ *RankedArena) { p[0].IsBot = true }}, {"backfill", func(p []RankedParticipant, _ *RankedArena) { p[0].IsBackfill = true }}, {"duplicate identity", func(p []RankedParticipant, _ *RankedArena) { p[1].SteamID = p[0].SteamID }}, {"unknown arena", func(_ []RankedParticipant, a *RankedArena) { a.ID = "arena_unknown" }}, } for _, test := range cases { t.Run(test.name, func(t *testing.T) { participants := rankedParticipants() arena := DefaultRankedArena() test.edit(participants, &arena) if err := ValidateRankedAdmission(participants, arena); err == nil { t.Fatal("invalid ranked admission accepted") } }) } } func TestRankedArenaRegistryExcludesElevatedVariants(t *testing.T) { for _, id := range []string{"arena_01_elevated", "arena_02_elevated", "arena_03_elevated"} { if err := ValidateRankedAdmission(rankedParticipants(), RankedArena{ID: id}); err == nil { t.Fatalf("elevated arena %q accepted for ranked", id) } } } func TestIsRankedArenaPathOnlyAllowsFloorGoalRegistry(t *testing.T) { for _, path := range []string{"res://scenes/arena_01.tscn", "res://scenes/arena_02.tscn", "res://scenes/arena_03.tscn"} { if !IsRankedArenaPath(path) { t.Fatalf("eligible path %q rejected", path) } } for _, path := range []string{"", "res://scenes/arena_01_elevated.tscn", "res://forged.tscn"} { if IsRankedArenaPath(path) { t.Fatalf("ineligible path %q accepted", path) } } } func TestRankedArenaForProposalIsStableAndRotatesEligibleRegistry(t *testing.T) { first := RankedArenaForProposal("proposal-stable") if first != RankedArenaForProposal("proposal-stable") { t.Fatal("same proposal selected different arenas") } seen := map[string]bool{} for index := 0; index < 128; index++ { arena := RankedArenaForProposal(fmt.Sprintf("proposal-%d", index)) if !validRankedArena(arena) { t.Fatalf("proposal selected ineligible arena %+v", arena) } seen[arena.ID] = true } if len(seen) != len(rankedArenaOrder) { t.Fatalf("selected arenas = %v, want every eligible arena", seen) } }