Files
bl/logic/controller/item_use_test.go
xinian 4b0a17e035
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
feat: 增加能量珠效果持久化逻辑
2026-04-28 06:03:05 +08:00

138 lines
3.7 KiB
Go

package controller
import (
"blazing/common/data/xmlres"
"blazing/logic/service/player"
playermodel "blazing/modules/player/model"
blservice "blazing/modules/player/service"
"testing"
)
func TestUsePetItemOutOfFightAppliesToBackupPetInMemory(t *testing.T) {
petID := firstPetIDForControllerTest(t)
backupPet := playermodel.GenPetInfo(petID, 31, 0, 0, 50, nil, 0)
if backupPet == nil {
t.Fatal("failed to generate backup pet")
}
if backupPet.MaxHp <= 1 {
t.Fatalf("expected generated pet to have max hp > 1, got %d", backupPet.MaxHp)
}
backupPet.Hp = 1
testPlayer := player.NewPlayer(nil)
testPlayer.Info = &playermodel.PlayerInfo{
UserID: 1,
PetList: []playermodel.PetInfo{},
BackupPetList: []playermodel.PetInfo{*backupPet},
}
testPlayer.Service = blservice.NewUserService(testPlayer.Info.UserID)
itemID, recoverHP := firstRecoverHPItemForControllerTest(t)
if recoverHP <= 0 {
t.Fatalf("expected positive recover hp for item %d, got %d", itemID, recoverHP)
}
_, err := (Controller{}).UsePetItemOutOfFight(&C2S_USE_PET_ITEM_OUT_OF_FIGHT{
CatchTime: backupPet.CatchTime,
ItemID: int32(itemID),
}, testPlayer)
if err != 0 {
t.Fatalf("expected backup pet item use to succeed in-memory, got err=%d", err)
}
updatedPet := testPlayer.Info.BackupPetList[0]
if updatedPet.Hp <= 1 {
t.Fatalf("expected backup pet hp to increase in memory, got hp=%d", updatedPet.Hp)
}
}
func TestUsePetItemOutOfFightPersistsEnergyOrbEffectInfo(t *testing.T) {
petID := firstPetIDForControllerTest(t)
petInfo := playermodel.GenPetInfo(petID, 31, 0, 0, 50, nil, 0)
if petInfo == nil {
t.Fatal("failed to generate test pet")
}
testPlayer := player.NewPlayer(nil)
testPlayer.Info = &playermodel.PlayerInfo{
UserID: 10001,
PetList: []playermodel.PetInfo{*petInfo},
}
testPlayer.Service = blservice.NewUserService(testPlayer.Info.UserID)
itemID, effectCfg := firstEnergyOrbItemForControllerTest(t)
if err := testPlayer.Service.Item.UPDATE(itemID, 1); err != nil {
t.Fatalf("failed to seed energy orb item %d: %v", itemID, err)
}
_, err := (Controller{}).UsePetItemOutOfFight(&C2S_USE_PET_ITEM_OUT_OF_FIGHT{
CatchTime: petInfo.CatchTime,
ItemID: int32(itemID),
}, testPlayer)
if err != 0 {
t.Fatalf("expected energy orb use to succeed, got err=%d", err)
}
storedPet := testPlayer.Info.PetList[0]
if len(storedPet.EffectInfo) == 0 {
t.Fatalf("expected pet effect info to persist after using item %d", itemID)
}
last := storedPet.EffectInfo[len(storedPet.EffectInfo)-1]
if last.ItemID != itemID {
t.Fatalf("expected stored item id %d, got %d", itemID, last.ItemID)
}
if last.Status != 2 {
t.Fatalf("expected energy orb status 2, got %d", last.Status)
}
if last.EID != uint16(atoiOrZero(effectCfg.Eid)) {
t.Fatalf("expected effect id %s, got %d", effectCfg.Eid, last.EID)
}
}
func firstRecoverHPItemForControllerTest(t *testing.T) (uint32, int) {
t.Helper()
for id, cfg := range xmlres.ItemsMAP {
if cfg.HP > 0 {
return uint32(id), cfg.HP
}
}
t.Fatal("xmlres.ItemsMAP has no HP recovery item")
return 0, 0
}
func firstEnergyOrbItemForControllerTest(t *testing.T) (uint32, xmlres.NewSeIdx) {
t.Helper()
for id, itemCfg := range xmlres.ItemsMAP {
if itemCfg.NewSeIdx == 0 {
continue
}
effectCfg, ok := xmlres.EffectMAP[itemCfg.NewSeIdx]
if !ok {
continue
}
if effectCfg.Stat == "2" && effectCfg.ItemId != nil {
return uint32(id), effectCfg
}
}
t.Fatal("xmlres.ItemsMAP has no energy orb item")
return 0, xmlres.NewSeIdx{}
}
func atoiOrZero(value string) int {
result := 0
for _, ch := range value {
if ch < '0' || ch > '9' {
return result
}
result = result*10 + int(ch-'0')
}
return result
}