package dnfbridge import ( "errors" "fmt" "testing" dnfdungeonadmission "longheng.io/server/internal/modules/dnf/dungeonadmission" ) // 额度用尽必须映射成专用提示码(0xF6),而不是通用的"准备失败"。 // // 这条覆盖单人入场路径:周常五图 [limit party count] 1,玩家只走单人路径, // 撞上限时客户端应显示"今日入场次数已用尽"。 func TestAbisLimitExhaustionMapsToDedicatedReason(t *testing.T) { limitErr := &dnfdungeonadmission.LimitError{Snapshot: dnfdungeonadmission.Snapshot{ Policy: dnfdungeonadmission.Policy{Key: "abis.weekly_day.4906.character.daily"}, Used: 2, EffectiveLimit: 2, }} // 裸 LimitError。 if got := currentDungeonAdmissionCounterFailureReason(limitErr); got != currentSelectDungeonDailyEntryLimitReachedReason { t.Fatalf("bare LimitError -> %#x want %#x", got, currentSelectDungeonDailyEntryLimitReachedReason) } // reserveCurrentDungeonAdmissionCounters 会用 fmt.Errorf("...: %w") 包装它, // 这里复现同一形状:必须仍然被识别。 wrapped := fmt.Errorf("reserve character 1 dungeon admission counter: %w", limitErr) if got := currentDungeonAdmissionCounterFailureReason(wrapped); got != currentSelectDungeonDailyEntryLimitReachedReason { t.Fatalf("wrapped LimitError -> %#x want %#x", got, currentSelectDungeonDailyEntryLimitReachedReason) } if !errors.As(wrapped, new(*dnfdungeonadmission.LimitError)) { t.Fatal("errors.As must unwrap the reserve wrapper") } // 非额度类错误仍是通用提示。 generic := fmt.Errorf("reserve character 1 dungeon admission counter: %w", errors.New("repository unavailable")) if got := currentDungeonAdmissionCounterFailureReason(generic); got != currentSelectDungeonPreparationRejectedReason { t.Fatalf("generic error -> %#x want %#x", got, currentSelectDungeonPreparationRejectedReason) } // 两者必须是不同的码,否则专用提示没有意义。 if currentSelectDungeonDailyEntryLimitReachedReason == currentSelectDungeonPreparationRejectedReason { t.Fatal("dedicated limit reason must differ from the generic rejection reason") } t.Logf("limit reason=%#x generic reason=%#x", currentSelectDungeonDailyEntryLimitReachedReason, currentSelectDungeonPreparationRejectedReason) }