Files
bd2/go/internal/server/account/reward_state_test.go
T
Flechazo d04791dd31 feat(server): add colored logs, level rewards, hunting dispatch and fiend hunt
Persist claims, AP, teams and presets with session receipts and atomic request rollback. Read rewards and growth from GameData; replace fixed Fiend Hunt user state and preserve the account initialization contract.
2026-10-04 21:27:19 +08:00

59 lines
1.8 KiB
Go

package account
import (
"errors"
"math"
"testing"
"bd2server/internal/server/wire"
)
type rewardStateSource struct {
claimed, free, bonus uint64
err error
}
func (p *rewardStateSource) LevelRewardCount() (uint64, error) { return p.claimed, p.err }
func (p *rewardStateSource) HuntingAP() (uint64, uint64, error) { return p.free, p.bonus, p.err }
func TestLoginReadsMutableRewardAndHuntingState(t *testing.T) {
user := wire.AppendVarint(nil, 1, 42)
for _, field := range []int{13, 20, 21} {
user = wire.AppendVarint(user, field, 999)
}
seed := &LoginSeed{Version: StateVersion(), PacketCode: 3, UserInfo: user}
p := &rewardStateSource{claimed: 2, free: 40, bonus: 7}
if err := seed.AttachLevelReward(p); err != nil {
t.Fatal(err)
}
if err := seed.AttachHuntingAP(p); err != nil {
t.Fatal(err)
}
for _, state := range []rewardStateSource{*p, {claimed: 3, free: 20, bonus: 0}, {}} {
*p = state
response, err := seed.Login(nil, []byte("0123456789abcdef0123456789abcdef"))
if err != nil {
t.Fatal(err)
}
actual, _, _ := wire.Bytes(response, 1)
for field, want := range map[int]uint64{13: p.claimed, 20: p.free, 21: p.bonus} {
got, _, err := wire.Varint(actual, field)
if err != nil || got != want {
t.Fatalf("field %d=%d want %d: %v", field, got, want, err)
}
}
}
for _, bad := range []rewardStateSource{{claimed: math.MaxInt32 + 1}, {free: math.MaxInt32 + 1}, {bonus: math.MaxInt32 + 1}, {err: errors.New("storage failed")}} {
*p = bad
if _, err := seed.Login(nil, []byte("0123456789abcdef0123456789abcdef")); err == nil {
t.Fatal("invalid state accepted")
}
}
if err := seed.AttachLevelReward(nil); err == nil {
t.Fatal("nil reward provider accepted")
}
if err := seed.AttachHuntingAP(nil); err == nil {
t.Fatal("nil AP provider accepted")
}
}