138 lines
3.7 KiB
Go
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
|
|
}
|