package gameserver import ( "strconv" "testing" "google.golang.org/protobuf/proto" goproto "gac-hkrpg-go/protocol/proto" ) func TestReadPrydwenLineupsUseCurrentClientAvatarResources(t *testing.T) { lineups, err := readPrydwenLineups() if err != nil { t.Fatal(err) } if len(lineups) != 3 { t.Fatalf("want 3 MoC stage teams, got %d", len(lineups)) } for stage, lineup := range lineups { if len(lineup.GetAvatarList()) != 4 { t.Fatalf("stage %d: want 4 avatars, got %d", stage+1, len(lineup.GetAvatarList())) } seen := map[uint32]bool{} for slot, avatar := range lineup.GetAvatarList() { if avatar.GetId() == 0 || avatar.GetAvatarType() != goproto.AvatarType_AVATAR_FORMAL_TYPE { t.Fatalf("stage %d slot %d has invalid avatar resource: %v", stage+1, slot, avatar) } if seen[avatar.GetId()] { t.Fatalf("stage %d repeats AvatarID %d", stage+1, avatar.GetId()) } seen[avatar.GetId()] = true if avatar.GetIndex() != uint32(slot) { t.Fatalf("stage %d slot %d has index %d", stage+1, slot, avatar.GetIndex()) } } } } func TestPrydwenRecommendationsCoverEveryEndgameMode(t *testing.T) { snapshot, err := loadPrydwenSnapshot() if err != nil { t.Fatal(err) } avatarIDs, err := readPrydwenAvatarIDs(snapshot.AvatarAliases) if err != nil { t.Fatal(err) } for _, mode := range []string{"moc", "pf", "as", "aa"} { typeText := "" for requestType, routedMode := range snapshot.Protocol.RequestTypeRoutes { if routedMode == mode { typeText = requestType break } } typeValue, err := strconv.ParseInt(typeText, 10, 32) if err != nil { t.Fatalf("mode %s has no valid request type route %q: %v", mode, typeText, err) } rsp, err := buildPrydwenRecommendResponse(&goproto.GetFriendRecommendLineupCsReq{ Type: goproto.JFNJKAPPNOF(typeValue), Key: 0, }) if err != nil { t.Fatalf("mode %s: %v", mode, err) } if rsp.GetType() != goproto.JFNJKAPPNOF(typeValue) { t.Fatalf("mode %s response lost request type", mode) } group := rsp.GetMGKCKHIIICL()[0] if mode == "aa" { payload := group.GetLMHIOKFMDNE() if payload == nil || len(payload.GetDNIGKDKIPPJ()) != len(snapshot.Modes[mode].Stages) { t.Fatalf("AA response does not contain one Peak lineup per source stage: %v", payload) } for _, peak := range payload.GetDNIGKDKIPPJ() { if peak.GetPeakId() == 0 || len(peak.GetAvatarList()) != 4 { t.Fatalf("invalid AA Peak recommendation: %v", peak) } } continue } payload := group.GetNHKCFOALAPD() lineups, err := buildPrydwenLineups(snapshot.Modes[mode], avatarIDs) if err != nil { t.Fatalf("mode %s: %v", mode, err) } if payload == nil || len(payload.GetLineupList()) != len(lineups) { t.Fatalf("mode %s response has wrong team count: %v", mode, payload) } } } func TestBuildPrydwenRecommendResponsePreservesRequestAndLineups(t *testing.T) { req := &goproto.GetFriendRecommendLineupCsReq{ Type: goproto.JFNJKAPPNOF_JFNJKAPPNOF_JHOEBNNMKHB, Key: 101201, } rsp, err := buildPrydwenRecommendResponse(req) if err != nil { t.Fatal(err) } if rsp.GetType() != req.GetType() || rsp.GetKey() != req.GetKey() { t.Fatalf("response context does not match request: req=%v rsp=%v", req, rsp) } if len(rsp.GetMGKCKHIIICL()) != 1 { t.Fatalf("want one Prydwen recommendation group, got %d", len(rsp.GetMGKCKHIIICL())) } payload := rsp.GetMGKCKHIIICL()[0].GetNHKCFOALAPD() if payload == nil || len(payload.GetLineupList()) != 3 { t.Fatalf("want three stage lineups in the protocol recommendation oneof, got %v", payload) } encoded, err := proto.Marshal(rsp) if err != nil { t.Fatal(err) } var decoded goproto.GetFriendRecommendLineupScRsp if err := proto.Unmarshal(encoded, &decoded); err != nil { t.Fatal(err) } if len(decoded.GetMGKCKHIIICL()[0].GetNHKCFOALAPD().GetLineupList()) != 3 { t.Fatal("wire round-trip lost recommended teams") } }