Files
bd2/go/internal/server/eventtasks/calendar_identity_test.go
T
Flechazo d8771caef2 feat(all): add hunting and events, commerce and rewards, binary calendars, GameData caching and login diagnostics
Implement hunting AP and progress, event tasks, exchanges, games, stories and actions; connect battle and reward handling.

Add CashShop plugin and installation, server purchases and entitlements, recharge rules and plugin version metadata.

Distribute binary calendars independently; cache GameData in memory and fix single-connection query deadlocks.

Improve automatic login and recovery diagnostics; document configuration and release flows.
2026-10-05 11:50:31 +08:00

82 lines
2.4 KiB
Go

package eventtasks
import (
"bd2server/internal/server/events"
"bd2server/internal/server/gamedata"
"bd2server/internal/server/wire"
"testing"
)
func TestZeroUIDMissionGroupsKeepIndependentClaimsAfterRestart(t *testing.T) {
s, economy, store := setup(t)
now := s.now().UnixMilli()
rows := []events.Schedule{{Type: 4, ID: 7, Start: now - 1, End: now + 10000}, {Type: 4, ID: 8, Start: now - 1, End: now + 10000}}
if err := s.registry.(*events.Registry).Replace(rows); err != nil {
t.Fatal(err)
}
s.design.MissionGroups[8] = gamedata.EventMissionGroup{ID: 8, Groups: []uint64{9}}
if err := s.RecordEvent(2, 0, 2, nil); err != nil {
t.Fatal(err)
}
claim := func(seq, group uint64) []byte {
b := wire.AppendVarint(req(seq), 3, 2)
b = wire.AppendVarint(b, 4, 9)
b = wire.AppendVarint(b, 5, 10)
return wire.AppendVarint(b, 6, group)
}
if _, _, _, err := s.Handle("/MissionClear", claim(1, 7)); err != nil {
t.Fatal(err)
}
if !s.mission(rows[0], 10).Claimed || s.mission(rows[1], 10).Claimed {
t.Fatal("claim leaked across zero-UID groups")
}
restarted, err := Open(store, s.design, s.registry, economy)
if err != nil {
t.Fatal(err)
}
restarted.now = s.now
if !restarted.mission(rows[0], 10).Claimed || restarted.mission(rows[1], 10).Claimed {
t.Fatal("independent claims lost after restart")
}
if _, _, _, err := restarted.Handle("/MissionClear", claim(2, 8)); err != nil {
t.Fatal(err)
}
if economy.calls != 2 {
t.Fatalf("reward grants=%d", economy.calls)
}
}
func TestInactiveCalendarDoesNotHideActivePassMissions(t *testing.T) {
s, _, _ := setup(t)
now := s.now().UnixMilli()
if err := s.registry.(*events.Registry).Replace([]events.Schedule{
{UID: 2, Type: 4, ID: 7, Start: now - 20, End: now - 10},
{UID: 3, Type: 5, ID: 8, Start: now - 1, End: now + 10000},
{UID: 4, Type: 4, ID: 9, Start: now + 10000, End: now + 20000},
}); err != nil {
t.Fatal(err)
}
if err := s.RecordEvent(2, 0, 1, nil); err != nil {
t.Fatal(err)
}
_, out, _, err := s.Handle("/EventMissionInfo", req(1))
if err != nil {
t.Fatal(err)
}
count := 0
if err := wire.Walk(out, func(f wire.Field) error {
if f.Number == 1 {
count++
if scalar(f.Value, 1) != 7 || scalar(f.Value, 4) != 1 {
t.Fatalf("unexpected mission entry %x", f.Value)
}
}
return nil
}); err != nil {
t.Fatal(err)
}
if count != 1 {
t.Fatalf("active mission count=%d", count)
}
}