Files
bd2/go/internal/server/world/achievement_events_test.go
T
Flechazo aec053f7d2 fix(server): restore achievements, progress, claims and experience
Load ordinary achievements and send transactional gameplay progress notifications.
Restore main-story clears and recorded gacha history without duplicate credit.
Validate claim thresholds and prior tiers, credit wallet rewards and persist
achievement experience in login responses.
2026-10-04 19:54:26 +08:00

49 lines
1.5 KiB
Go

package world
import (
"bd2server/internal/server/gamedata"
"bd2server/internal/server/stateio"
"bd2server/internal/server/wire"
"testing"
)
func TestAchievementEventsMatchDesignAndReplayAcrossReopen(t *testing.T) {
store := stateio.NewMemory()
design := &gamedata.AchievementCounterDesign{Groups: map[int][]int{987: {0, 1}, 654: {0}}, Conditions: map[int]gamedata.AchievementCondition{987: {Type: 54}, 654: {Type: 54, SubType: 2}}}
s, err := NewAchievementService(design, store)
if err != nil {
t.Fatal(err)
}
updates, err := s.RecordEvent("draw:1", 54, 0, 10)
if err != nil || len(updates) != 1 {
t.Fatalf("updates=%d err=%v", len(updates), err)
}
value, _, _ := wire.Varint(updates[0], 2)
isSet, _, _ := wire.Varint(updates[0], 3)
if value != 10 || isSet != 1 {
t.Fatal("notify not absolute")
}
s, err = NewAchievementService(design, store)
if err != nil {
t.Fatal(err)
}
if updates, err := s.RecordEvent("draw:1", 54, 0, 10); err != nil || len(updates) != 0 {
t.Fatalf("replay=%v err=%v", updates, err)
}
if _, err := s.RecordEvent("draw:1", 54, 0, 9); err == nil {
t.Fatal("replay mismatch accepted")
}
if v, err := s.AchievementValue(987); err != nil || v != 10 {
t.Fatalf("value=%d err=%v", v, err)
}
if v, _ := s.AchievementValue(654); v != 0 {
t.Fatal("wrong subtype incremented")
}
if updates, err := s.SetCondition(54, 2, 7); err != nil || len(updates) != 1 {
t.Fatal(err)
}
if updates, err := s.SetCondition(54, 2, 7); err != nil || len(updates) != 0 {
t.Fatal("absolute unchanged notified")
}
}