package player import ( "blazing/common/data/xmlres" playermodel "blazing/modules/player/model" "testing" ) func firstPetIDForTest(t *testing.T) int { t.Helper() for id := range xmlres.PetMAP { return id } t.Fatal("xmlres.PetMAP is empty") return 0 } func TestAddPetExpAllowsLevelBeyond100WhilePanelStaysCapped(t *testing.T) { petID := firstPetIDForTest(t) petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 100, nil, 0) expectedPanel := playermodel.GenPetInfo(petID, 31, 0, 0, 100, nil, 0) if petInfo == nil { t.Fatalf("failed to generate test pet") } if expectedPanel == nil { t.Fatalf("failed to generate expected test pet") } player := &Player{ baseplayer: baseplayer{ Info: &playermodel.PlayerInfo{ ExpPool: 1_000_000, }, }, } player.AddPetExp(petInfo, petInfo.NextLvExp+10_000) if petInfo.Level <= 100 { t.Fatalf("expected pet level to continue beyond 100, got %d", petInfo.Level) } if petInfo.MaxHp != expectedPanel.MaxHp { t.Fatalf("expected max hp to stay capped at 100-level panel, got %d want %d", petInfo.MaxHp, expectedPanel.MaxHp) } if petInfo.Prop != expectedPanel.Prop { t.Fatalf("expected props to stay capped at 100-level panel, got %+v want %+v", petInfo.Prop, expectedPanel.Prop) } } func TestAddPetExpRecalculatesPanelForLevelAbove100(t *testing.T) { petID := firstPetIDForTest(t) petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 100, nil, 0) expectedPanel := playermodel.GenPetInfo(petID, 31, 0, 0, 100, nil, 0) if petInfo == nil { t.Fatalf("failed to generate test pet") } if expectedPanel == nil { t.Fatalf("failed to generate expected test pet") } petInfo.Level = 101 petInfo.Exp = 7 petInfo.MaxHp = 1 petInfo.Hp = 999999 player := &Player{ baseplayer: baseplayer{ Info: &playermodel.PlayerInfo{ ExpPool: 50_000, }, }, } player.AddPetExp(petInfo, 12_345) if petInfo.Level < 101 { t.Fatalf("expected level above 100 to be preserved, got %d", petInfo.Level) } if petInfo.MaxHp != expectedPanel.MaxHp { t.Fatalf("expected max hp to be recalculated using level 100 cap, got %d want %d", petInfo.MaxHp, expectedPanel.MaxHp) } if petInfo.Hp != petInfo.MaxHp { t.Fatalf("expected hp to be clamped to recalculated max hp, got hp=%d maxHp=%d", petInfo.Hp, petInfo.MaxHp) } if player.Info.ExpPool != 50_000-12_345 { t.Fatalf("expected exp pool to be consumed normally, got %d", player.Info.ExpPool) } } func TestAddPetExpSmallRewardDoesNotJumpToMaxLevel(t *testing.T) { petID := firstPetIDForTest(t) petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 20, nil, 0) if petInfo == nil { t.Fatalf("failed to generate test pet") } player := &Player{ baseplayer: baseplayer{ Info: &playermodel.PlayerInfo{ ExpPool: 1_000_000, }, }, } addExp := int64(100) originalLevel := petInfo.Level nextLevelNeed := petInfo.NextLvExp - petInfo.Exp if addExp >= nextLevelNeed { t.Fatalf("test setup invalid: addExp=%d should be smaller than next level need=%d", addExp, nextLevelNeed) } player.AddPetExp(petInfo, addExp) if petInfo.Level != originalLevel { t.Fatalf("expected level to stay at %d, got %d", originalLevel, petInfo.Level) } if petInfo.Exp != addExp { t.Fatalf("expected current exp to increase by %d, got %d", addExp, petInfo.Exp) } if player.Info.ExpPool != 1_000_000-addExp { t.Fatalf("expected exp pool to decrease by %d, got %d", addExp, player.Info.ExpPool) } } func TestAddPetExpUsesDynamicPerLevelRequirement(t *testing.T) { petID := firstPetIDForTest(t) petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 20, nil, 0) if petInfo == nil { t.Fatalf("failed to generate test pet") } initialNeed := petInfo.NextLvExp if initialNeed <= 0 { t.Fatalf("expected positive exp requirement, got %d", initialNeed) } player := &Player{ baseplayer: baseplayer{ Info: &playermodel.PlayerInfo{ ExpPool: 1_000_000, }, }, } player.AddPetExp(petInfo, initialNeed) if petInfo.Level != 21 { t.Fatalf("expected pet level to become 21, got %d", petInfo.Level) } if petInfo.Exp != 0 { t.Fatalf("expected level-up to reset current level exp, got %d", petInfo.Exp) } if petInfo.NextLvExp == initialNeed { t.Fatalf("expected next level exp to change after leveling, still %d", petInfo.NextLvExp) } }