Files
GaCy-GO/internal/common/battle_report_test.go
T

237 lines
7.5 KiB
Go

package common
import (
"os"
"testing"
goproto "gac-hkrpg-go/protocol/proto"
)
func TestBattleReportUsesActualBattleSlots(t *testing.T) {
r := &BattleReport{Avatars: []*BattleAvatarReport{{AvatarID: 11}, {AvatarID: 10}}}
ApplyBattleReportContext(r, &goproto.SceneBattleInfo{BattleId: 7, StageId: 20, BattleAvatarList: []*goproto.BattleAvatar{{Id: 10, Index: 0}, {Id: 11, Index: 2}}})
if r.BattleID != 7 || r.StageID != 20 || r.Avatars[0].AvatarID != 10 || r.Avatars[0].Slot == nil || *r.Avatars[0].Slot != 0 || *r.Avatars[1].Slot != 2 {
t.Fatalf("battle identity/order lost: %+v", r)
}
}
func TestBattleReportSerialization(t *testing.T) {
defer os.Remove(BattleReportFile)
stt := &goproto.BattleStatistics{
TotalBattleTurns: 12,
TotalAutoTurns: 0,
RoundCnt: 2,
CostTime: 45.5,
ChallengeScore: 1000,
BattleAvatarList: []*goproto.AvatarBattleInfo{
{
Id: 1310,
AvatarLevel: 80,
AvatarRank: 2,
TotalDamage: 500000,
TotalDamageTaken: 2500,
TotalHeal: 0,
TotalBreakDamage: 400000,
TotalTurns: 6,
AttackTypeDamage: []*goproto.AttackDamageProperty{
{AttackType: "Normal", Damage: 20000},
{AttackType: "BPSkill", Damage: 80000},
{AttackType: "BreakDamage", Damage: 400000},
},
AttackTypeMaxDamage: []*goproto.AttackDamageProperty{
{AttackType: "BreakDamage", Damage: 250000},
},
SkillTimes: []*goproto.SkillUseProperty{
{SkillId: 131001, SkillType: "Normal", SkillUseCount: 1},
{SkillId: 131002, SkillType: "BPSkill", SkillUseCount: 4},
},
},
{
Id: 1001,
AvatarLevel: 80,
AvatarRank: 6,
TotalDamage: 50000,
TotalDamageTaken: 1200,
TotalShield: 4500,
TotalTurns: 6,
AttackTypeDamage: []*goproto.AttackDamageProperty{
{AttackType: "Normal", Damage: 50000},
},
},
},
MonsterList: []*goproto.MonsterBattleInfo{
{
EntityId: 101,
MonsterId: 3024010,
TotalTurns: 3,
TotalDamageTaken: 550000,
TotalDamage: 3700,
Wave: 1,
},
},
}
report := BattleReportFromStatistics(stt, 999, 1001, "WIN")
if report == nil {
t.Fatal("expected report, got nil")
}
if report.TeamTotalDamage != 550000 {
t.Fatalf("expected team total damage 550000, got %f", report.TeamTotalDamage)
}
if len(report.Avatars) != 2 {
t.Fatalf("expected 2 avatars, got %d", len(report.Avatars))
}
if report.Avatars[0].DamagePercent < 90 || report.Avatars[0].DamagePercent > 91 {
t.Fatalf("unexpected damage percent %f", report.Avatars[0].DamagePercent)
}
if err := SaveBattleReport(report); err != nil {
t.Fatalf("failed to save report: %v", err)
}
loaded, err := LoadLatestBattleReport()
if err != nil {
t.Fatalf("failed to load report: %v", err)
}
if loaded.BattleID != 999 {
t.Fatalf("expected battle id 999, got %d", loaded.BattleID)
}
if loaded.TeamTotalDamage != 550000 {
t.Fatalf("expected team damage 550000, got %f", loaded.TeamTotalDamage)
}
if err := ClearBattleReport(); err != nil {
t.Fatalf("failed to clear report: %v", err)
}
_, err = LoadLatestBattleReport()
if err == nil {
t.Fatal("expected error after clearing report, got nil")
}
}
func TestBattleReportUsesAvatarDamageEventsWhenAvatarTotalsAreZero(t *testing.T) {
stt := &goproto.BattleStatistics{
BattleAvatarList: []*goproto.AvatarBattleInfo{
{Id: 1503},
{Id: 1511},
},
OKFALMGFHMA: []*goproto.HDKEPPDIDIH{
{AvatarId: 1503, Damage: 720},
{AvatarId: 1503, Damage: 180},
{AvatarId: 1511, Damage: 100},
},
MonsterList: []*goproto.MonsterBattleInfo{{TotalDamageTaken: 1000}},
}
report := BattleReportFromStatistics(stt, 1, 1052106, "WIN")
if report.TeamTotalDamage != 1000 {
t.Fatalf("expected event-derived team damage 1000, got %f", report.TeamTotalDamage)
}
if report.Avatars[0].TotalDamage != 900 || report.Avatars[0].DamagePercent != 90 {
t.Fatalf("unexpected avatar 1503 report: %+v", report.Avatars[0])
}
if report.Avatars[1].TotalDamage != 100 || report.Avatars[1].DamagePercent != 10 {
t.Fatalf("unexpected avatar 1511 report: %+v", report.Avatars[1])
}
}
func TestBattleReportUsesDealtDamagePropertiesAndDoesNotCountDamageTaken(t *testing.T) {
stt := &goproto.BattleStatistics{
BattleAvatarList: []*goproto.AvatarBattleInfo{
{
Id: 1503,
AttackTypeDamage: []*goproto.AttackDamageProperty{
{AttackType: "Normal", Damage: 600},
},
// Native NOGHNMCDDAI contains damage taken, not dealt.
NOGHNMCDDAI: []*goproto.AttackDamageProperty{
{AttackType: "Normal", Damage: 900},
},
},
{
Id: 1511,
NOGHNMCDDAI: []*goproto.AttackDamageProperty{
{AttackType: "Skill", Damage: 400},
},
},
},
MonsterList: []*goproto.MonsterBattleInfo{{TotalDamageTaken: 1200}},
}
report := BattleReportFromStatistics(stt, 1, 0, "WIN")
if report.TeamTotalDamage != 600 {
t.Fatalf("expected dealt damage 600, got %f", report.TeamTotalDamage)
}
if report.Avatars[0].TotalDamage != 600 || report.Avatars[0].DamagePercent != 100 {
t.Fatalf("unexpected avatar 1503 report: %+v", report.Avatars[0])
}
if report.Avatars[1].TotalDamage != 0 || report.Avatars[1].DamagePercent != 0 {
t.Fatalf("unexpected avatar 1511 report: %+v", report.Avatars[1])
}
if len(report.Avatars[1].AttackTypeDamage) != 0 {
t.Fatalf("damage taken became dealt damage: %+v", report.Avatars[1].AttackTypeDamage)
}
}
func TestBattleReportFallsBackToMonsterDamageTakenForTeamTotal(t *testing.T) {
stt := &goproto.BattleStatistics{
BattleAvatarList: []*goproto.AvatarBattleInfo{{Id: 1503}},
MonsterList: []*goproto.MonsterBattleInfo{
{TotalDamageTaken: 250},
{TotalDamageTaken: 750},
},
}
report := BattleReportFromStatistics(stt, 1, 1052106, "WIN")
if report.TeamTotalDamage != 1000 {
t.Fatalf("expected monster-derived team damage 1000, got %f", report.TeamTotalDamage)
}
if report.Avatars[0].DamagePercent != 0 {
t.Fatalf("cannot infer avatar share from monster totals, got %f", report.Avatars[0].DamagePercent)
}
}
func TestBattleReportUsesSupplementalAvatarDamageWhenStandardFieldsAreEmpty(t *testing.T) {
stt := &goproto.BattleStatistics{
BattleAvatarList: []*goproto.AvatarBattleInfo{
{Id: 1409},
{Id: 1507},
},
MFOJKJGKDGD: &goproto.FAHGFCIJHFK{
TotalDamage: 1000,
INBNCAKGDPJ: []*goproto.PMPCIBGILIE{
{AvatarId: 1409, Damage: 400},
{AvatarId: 1507, Damage: 600},
},
},
MonsterList: []*goproto.MonsterBattleInfo{{TotalDamageTaken: 1500}},
}
report := BattleReportFromStatistics(stt, 1, 1052106, "WIN")
if report.TeamTotalDamage != 1000 {
t.Fatalf("expected supplemental team total damage 1000, got %f", report.TeamTotalDamage)
}
if report.Avatars[0].TotalDamage != 400 || report.Avatars[0].DamagePercent != 40 {
t.Fatalf("unexpected avatar 1409 report: %+v", report.Avatars[0])
}
if report.Avatars[1].TotalDamage != 600 || report.Avatars[1].DamagePercent != 60 {
t.Fatalf("unexpected avatar 1507 report: %+v", report.Avatars[1])
}
}
func TestBattleReportDoesNotReplaceStandardDamageWithSupplementalAggregate(t *testing.T) {
stt := &goproto.BattleStatistics{
BattleAvatarList: []*goproto.AvatarBattleInfo{{Id: 1409, TotalDamage: 400}},
MFOJKJGKDGD: &goproto.FAHGFCIJHFK{
TotalDamage: 900,
INBNCAKGDPJ: []*goproto.PMPCIBGILIE{{AvatarId: 1409, Damage: 900}},
},
}
report := BattleReportFromStatistics(stt, 1, 1052106, "WIN")
if report.TeamTotalDamage != 400 || report.Avatars[0].TotalDamage != 400 {
t.Fatalf("supplemental data replaced standard damage: %+v", report)
}
}