Files
bd2/go/internal/server/player/equipment_preset_test.go
T

175 lines
7.0 KiB
Go

package player
import (
"path/filepath"
"reflect"
"testing"
"bd2server/internal/server/wire"
)
func TestEquipmentPresetSaveInfoRenameAndRestart(t *testing.T) {
dir := t.TempDir()
inventory, err := OpenInventory(testStore(filepath.Join(dir, "items.json")), &Starter{Version: "2.35.10"})
if err != nil {
t.Fatal(err)
}
character := Character{InvenIndex: 100, ID: 350, Level: 20}
characters, err := OpenCharacterStore(testStore(filepath.Join(dir, "characters.json")), []Character{character}, inventory, "", "")
if err != nil {
t.Fatal(err)
}
equipment, err := OpenEquipmentInventory(testStore(filepath.Join(dir, "equipment.json")))
if err != nil {
t.Fatal(err)
}
if err := equipment.AttachSlots(map[uint64]uint64{10: 0, 11: 1}); err != nil {
t.Fatal(err)
}
if err := equipment.AttachCharacters(characters); err != nil {
t.Fatal(err)
}
first, _ := equipment.GrantOnce("preset-first", 10)
second, _ := equipment.GrantOnce("preset-second", 11)
equipment.mu.Lock()
next := cloneEquipmentSnapshot(equipment.owned)
next.Equipment[0].UseChar = character.InvenIndex
next.Equipment[1].UseChar = character.InvenIndex
if err := equipment.commitLocked(next, "preset test setup"); err != nil {
equipment.mu.Unlock()
t.Fatal(err)
}
equipment.mu.Unlock()
request := wire.AppendVarint(nil, 1, 1)
request = wire.AppendVarint(request, 2, character.InvenIndex)
request = wire.AppendVarint(request, 3, 2)
request = wire.AppendString(request, 4, "Boss")
request = wire.AppendVarint(request, 5, 7)
request = wire.AppendVarint(request, 6, 3)
for slot, index := range []uint64{first.InvenIndex, second.InvenIndex, 0, 0, 0} {
item := wire.AppendVarint(nil, 1, uint64(slot))
if index != 0 {
item = wire.AppendVarint(item, 2, index)
}
request = wire.AppendBytes(request, 7, item)
}
if code, _, handled, err := equipment.Handle("/EquipPresetSave", request); err != nil || !handled || code != 254 {
t.Fatalf("preset save code=%d handled=%v err=%v", code, handled, err)
}
assertEquipmentPresetInfo(t, equipment, character.InvenIndex, 2, "Boss", 7, 3, []uint64{first.InvenIndex, second.InvenIndex, 0, 0, 0})
rename := wire.AppendVarint(nil, 1, 2)
rename = wire.AppendVarint(rename, 2, character.InvenIndex)
rename = wire.AppendVarint(rename, 3, 2)
rename = wire.AppendString(rename, 4, "Raid")
rename = wire.AppendVarint(rename, 5, 9)
rename = wire.AppendVarint(rename, 6, 4)
if code, _, handled, err := equipment.Handle("/EquipPresetNameChange", rename); err != nil || !handled || code != 259 {
t.Fatalf("preset rename code=%d handled=%v err=%v", code, handled, err)
}
assertEquipmentPresetInfo(t, equipment, character.InvenIndex, 2, "Raid", 9, 4, []uint64{first.InvenIndex, second.InvenIndex, 0, 0, 0})
restarted, err := OpenEquipmentInventory(testStore(filepath.Join(dir, "equipment.json")))
if err != nil {
t.Fatal(err)
}
if err := restarted.AttachCharacters(characters); err != nil {
t.Fatal(err)
}
assertEquipmentPresetInfo(t, restarted, character.InvenIndex, 2, "Raid", 9, 4, []uint64{first.InvenIndex, second.InvenIndex, 0, 0, 0})
}
func TestEquipmentPresetRejectsForgedEquipment(t *testing.T) {
dir := t.TempDir()
inventory, _ := OpenInventory(testStore(filepath.Join(dir, "items.json")), &Starter{Version: "2.35.10"})
characters, _ := OpenCharacterStore(testStore(filepath.Join(dir, "characters.json")), []Character{{InvenIndex: 100, ID: 350, Level: 20}, {InvenIndex: 200, ID: 351, Level: 20}}, inventory, "", "")
equipment, _ := OpenEquipmentInventory(testStore(filepath.Join(dir, "equipment.json")))
_ = equipment.AttachSlots(map[uint64]uint64{10: 0})
_ = equipment.AttachCharacters(characters)
item, _ := equipment.GrantOnce("preset-forged", 10)
equipment.mu.Lock()
next := cloneEquipmentSnapshot(equipment.owned)
next.Equipment[0].UseChar = 200
_ = equipment.commitLocked(next, "preset forged setup")
equipment.mu.Unlock()
request := wire.AppendVarint(wire.AppendVarint(wire.AppendVarint(nil, 1, 1), 2, 100), 3, 1)
request = wire.AppendString(request, 4, "Forged")
request = wire.AppendVarint(request, 5, 1)
for slot := 0; slot < equipmentSlotCount; slot++ {
entry := wire.AppendVarint(nil, 1, uint64(slot))
if slot == 1 {
entry = wire.AppendVarint(entry, 2, item.InvenIndex)
}
request = wire.AppendBytes(request, 7, entry)
}
if _, _, handled, err := equipment.Handle("/EquipPresetSave", request); err == nil || !handled {
t.Fatalf("forged preset handled=%v err=%v", handled, err)
}
if len(equipment.presets) != 0 {
t.Fatal("forged preset was persisted")
}
}
func TestEquipmentPresetNameChangeCreatesEmptySlot(t *testing.T) {
dir := t.TempDir()
inventory, _ := OpenInventory(testStore(filepath.Join(dir, "items.json")), &Starter{Version: "2.35.10"})
characters, _ := OpenCharacterStore(testStore(filepath.Join(dir, "characters.json")), []Character{{InvenIndex: 100, ID: 350, Level: 20}}, inventory, "", "")
equipment, _ := OpenEquipmentInventory(testStore(filepath.Join(dir, "equipment.json")))
_ = equipment.AttachCharacters(characters)
request := wire.AppendVarint(wire.AppendVarint(wire.AppendVarint(nil, 1, 1), 2, 100), 3, 5)
request = wire.AppendString(request, 4, "Empty")
request = wire.AppendVarint(request, 5, 1)
if code, _, handled, err := equipment.Handle("/EquipPresetNameChange", request); err != nil || !handled || code != 259 {
t.Fatalf("empty preset rename code=%d handled=%v err=%v", code, handled, err)
}
assertEquipmentPresetInfo(t, equipment, 100, 5, "Empty", 1, 0, []uint64{0, 0, 0, 0, 0})
}
func assertEquipmentPresetInfo(t *testing.T, inventory *EquipmentInventory, character, slot uint64, name string, resource, color uint64, wantItems []uint64) {
t.Helper()
code, response, handled, err := inventory.Handle("/EquipPresetInfo", wire.AppendVarint(nil, 1, 99))
if err != nil || !handled || code != 253 {
t.Fatalf("preset info code=%d handled=%v err=%v", code, handled, err)
}
charInfo, found, err := wire.Bytes(response, 1)
if err != nil || !found {
t.Fatalf("preset char info found=%v err=%v", found, err)
}
if got, _, _ := wire.Varint(charInfo, 1); got != character {
t.Fatalf("preset character=%d want=%d", got, character)
}
preset, found, err := wire.Bytes(charInfo, 2)
if err != nil || !found {
t.Fatalf("preset found=%v err=%v", found, err)
}
if got, _, _ := wire.Varint(preset, 2); got != slot {
t.Fatalf("preset slot=%d want=%d", got, slot)
}
if got, _, _ := wire.Bytes(preset, 1); string(got) != name {
t.Fatalf("preset name=%q want=%q", got, name)
}
if got, _, _ := wire.Varint(preset, 3); got != resource {
t.Fatalf("preset resource=%d want=%d", got, resource)
}
if got, _, _ := wire.Varint(preset, 4); got != color {
t.Fatalf("preset color=%d want=%d", got, color)
}
var gotItems []uint64
if err := wire.Walk(preset, func(field wire.Field) error {
if field.Number == 5 && field.Type == 2 {
index, _, err := wire.Varint(field.Value, 2)
if err != nil {
return err
}
gotItems = append(gotItems, index)
}
return nil
}); err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(gotItems, wantItems) {
t.Fatalf("preset items=%v want=%v", gotItems, wantItems)
}
}