package gameserver import ( "testing" "gac-hkrpg-go/internal/common" pb "gac-hkrpg-go/protocol/proto" ) func TestCurrencyWarsQuitSettleIsRegistered(t *testing.T) { requestID, ok := pb.CmdIDByName["GridFightQuitSettleCsReq"] if !ok || typedHandlers[uint16(requestID)] == nil { t.Fatal("GridFightQuitSettle must have a typed handler") } if _, ok := dummyResponses[uint16(requestID)]; ok { t.Fatal("GridFightQuitSettle must not use an empty dummy response") } } func TestCurrencyWarsAbandonRunPreservesOtherGetData(t *testing.T) { metadata := &pb.CLEDCMIOIPF{} data := &pb.GridFightGetDataScRsp{ LFLCDNGALME: metadata, DHFOFLFCLAH: &pb.MPIMAEMCEFH{UniqueId: 42, IsOverlock: true}, } runID, active := currencyWarsAbandonRun(data) if !active || runID != 42 { t.Fatalf("abandon result = (run %d, active %t); want (42, true)", runID, active) } if data.DHFOFLFCLAH != nil || data.LFLCDNGALME != metadata { t.Fatal("abandon must clear only the active run and preserve season data") } if _, active = currencyWarsAbandonRun(data); active { t.Fatal("abandon without an active run must be rejected") } } func TestCurrencyWarsQuitSettlementUsesActiveRunData(t *testing.T) { catalog, err := common.LoadCurrencyWarsCatalog() if err != nil { t.Fatal(err) } divisions := catalog.SeasonDivisions(catalog.ActiveSeasonID) if len(divisions) == 0 { t.Fatal("active season has no captured divisions") } division := divisions[0] run := &pb.MPIMAEMCEFH{ UniqueId: 42, DivisionId: division.ID, IsOverlock: true, JLDDDLDNFEF: &pb.CLFABOEKMJI{}, NAGDJGMMCBE: []*pb.GridFightGameInfo{ {LEOIAOFBBFA: &pb.GridFightGameInfo_FAOCFBOFCJP{FAOCFBOFCJP: &pb.NIHNGPKHEPC{PPKKHHNEOHB: 90, GridFightLineupHp: 72, GDAKCOICIDA: 3}}}, {LEOIAOFBBFA: &pb.GridFightGameInfo_EJIPINIKNCK{EJIPINIKNCK: &pb.HKFECLCHBFJ{GridGameRoleList: []*pb.CDEAABODKCP{ {Id: 8001, RoleStar: 2, Pos: 1}, {Id: 8002, RoleStar: 1, Pos: 2}, }}}}, {LEOIAOFBBFA: &pb.GridFightGameInfo_KLCPAAHDPJF{KLCPAAHDPJF: &pb.BEEFLEJAOCN{ DCAHJELNJNP: 4, EMOHLJHPOPC: 7001, SectionId: 5, }}}, }, } keepWin, settlement, err := currencyWarsQuitSettlement(catalog, run) if err != nil { t.Fatal(err) } if keepWin.EHBLJGIENPI != 3 { t.Fatalf("keep-win count = %d, want 3", keepWin.EHBLJGIENPI) } finish := settlement.BFLLJJBHLDF if settlement.FLHOPMMEGAI != division.ID || finish == nil || finish.Reason != pb.PEIJNEFOCHI_PEIJNEFOCHI_NOCIJDINKPJ { t.Fatalf("quit settlement identity/reason = division %d finish %v", settlement.FLHOPMMEGAI, finish) } if settlement.NMCKJPEMACM != catalog.ActiveSeasonModule().MaxRewardExp || settlement.CDANKDNACJP == 0 { t.Fatalf("settlement season metadata is incomplete: exp=%d highest_division=%d", settlement.NMCKJPEMACM, settlement.CDANKDNACJP) } if finish.NDLIKNEKDLL == nil || finish.NDLIKNEKDLL.LKCJAPIGEND != 90 || finish.NDLIKNEKDLL.PAGPKOKMDBK != 72 || finish.NDLIKNEKDLL.DCAHJELNJNP != 4 || finish.NDLIKNEKDLL.EMOHLJHPOPC != 7001 || finish.NDLIKNEKDLL.SectionId != 5 { t.Fatalf("settlement basic info does not match saved run: %v", finish.NDLIKNEKDLL) } if !finish.IsOverlock || finish.PPJFPNMIFHL == nil || len(finish.PPJFPNMIFHL.GridFightAvatarList) != 2 || finish.PPJFPNMIFHL.GridFightAvatarList[0] != 8001 || finish.PPJFPNMIFHL.GridFightAvatarList[1] != 8002 { t.Fatal("settlement did not preserve mode and sorted team avatar data") } }