2026-05-20 14:34:10 +08:00

80 lines
3.1 KiB
Go

package roomtreasure
import (
"errors"
"testing"
)
func TestNormalizeConfigDefaultsAndSortsLevels(t *testing.T) {
config, err := normalizeConfig(RoomTreasureConfig{
AppCode: "lalu",
OpenDelayMS: defaultOpenDelayMS,
Levels: []RoomTreasureLevelConfig{
{Level: 2, EnergyThreshold: 300},
{Level: 1, EnergyThreshold: 100},
{Level: 3, EnergyThreshold: 600},
{Level: 4, EnergyThreshold: 1_000},
{Level: 5, EnergyThreshold: 1_500},
{Level: 6, EnergyThreshold: 2_100},
{Level: 7, EnergyThreshold: 2_800},
},
})
if err != nil {
t.Fatalf("normalizeConfig failed: %v", err)
}
if config.EnergySource != defaultEnergySource || config.OpenDelayMS != defaultOpenDelayMS || config.BroadcastScope != defaultBroadcastScope {
t.Fatalf("default fields mismatch: %+v", config)
}
if config.Levels[0].Level != 1 || config.Levels[6].Level != 7 {
t.Fatalf("levels should be sorted by level: %+v", config.Levels)
}
}
func TestDefaultConfigKeepsOperationalDefaults(t *testing.T) {
config, err := normalizeConfig(defaultConfig("lalu"))
if err != nil {
t.Fatalf("normalizeConfig(defaultConfig) failed: %v", err)
}
if !config.BroadcastEnabled || config.OpenDelayMS != defaultOpenDelayMS || len(config.Levels) != roomTreasureLevelCount {
t.Fatalf("default config mismatch: %+v", config)
}
}
func TestNormalizeConfigRejectsInvalidLevels(t *testing.T) {
tests := []struct {
name string
config RoomTreasureConfig
}{
{name: "missing_level", config: RoomTreasureConfig{AppCode: "lalu", Levels: []RoomTreasureLevelConfig{{Level: 1, EnergyThreshold: 1}}}},
{name: "duplicate", config: RoomTreasureConfig{AppCode: "lalu", Levels: []RoomTreasureLevelConfig{
{Level: 1, EnergyThreshold: 1}, {Level: 1, EnergyThreshold: 2}, {Level: 3, EnergyThreshold: 3}, {Level: 4, EnergyThreshold: 4}, {Level: 5, EnergyThreshold: 5}, {Level: 6, EnergyThreshold: 6}, {Level: 7, EnergyThreshold: 7},
}}},
{name: "zero_threshold", config: RoomTreasureConfig{AppCode: "lalu", Levels: []RoomTreasureLevelConfig{
{Level: 1, EnergyThreshold: 0}, {Level: 2, EnergyThreshold: 2}, {Level: 3, EnergyThreshold: 3}, {Level: 4, EnergyThreshold: 4}, {Level: 5, EnergyThreshold: 5}, {Level: 6, EnergyThreshold: 6}, {Level: 7, EnergyThreshold: 7},
}}},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
_, err := normalizeConfig(test.config)
if !errors.Is(err, ErrInvalidArgument) {
t.Fatalf("normalizeConfig should reject %s with ErrInvalidArgument, got %v", test.name, err)
}
})
}
}
func TestNormalizeConfigRejectsIncompleteRewardAndEnergyRule(t *testing.T) {
config := defaultConfig("lalu")
config.Levels[0].InRoomRewards = []RoomTreasureRewardItem{{ResourceGroupID: 0, Weight: 100}}
if _, err := normalizeConfig(config); !errors.Is(err, ErrInvalidArgument) {
t.Fatalf("reward without resource group should be invalid, got %v", err)
}
config = defaultConfig("lalu")
config.GiftEnergyRules = []GiftEnergyRuleConfig{{GiftID: "gift-1"}}
if _, err := normalizeConfig(config); !errors.Is(err, ErrInvalidArgument) {
t.Fatalf("energy rule without multiplier or fixed energy should be invalid, got %v", err)
}
}