mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
81 lines
2.8 KiB
Go
81 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|