package decision import ( "testing" ) // TestLeverageFallback 测试杠杆超限时的自动修正功能 func TestLeverageFallback(t *testing.T) { tests := []struct { name string decision Decision accountEquity float64 btcEthLeverage int altcoinLeverage int wantLeverage int // 期望修正后的杠杆值 wantError bool }{ { name: "山寨币杠杆超限_自动修正为上限", decision: Decision{ Symbol: "SOLUSDT", Action: "open_long", Leverage: 20, // 超过上限 PositionSizeUSD: 100, StopLoss: 50, TakeProfit: 200, }, accountEquity: 100, btcEthLeverage: 10, altcoinLeverage: 5, // 上限 5x wantLeverage: 5, // 应该修正为 5 wantError: false, }, { name: "BTC杠杆超限_自动修正为上限", decision: Decision{ Symbol: "BTCUSDT", Action: "open_long", Leverage: 20, // 超过上限 PositionSizeUSD: 1000, StopLoss: 90000, TakeProfit: 110000, }, accountEquity: 100, btcEthLeverage: 10, // 上限 10x altcoinLeverage: 5, wantLeverage: 10, // 应该修正为 10 wantError: false, }, { name: "杠杆在上限内_不修正", decision: Decision{ Symbol: "ETHUSDT", Action: "open_short", Leverage: 5, // 未超限 PositionSizeUSD: 500, StopLoss: 4000, TakeProfit: 3000, }, accountEquity: 100, btcEthLeverage: 10, altcoinLeverage: 5, wantLeverage: 5, // 保持不变 wantError: false, }, { name: "杠杆为0_应该报错", decision: Decision{ Symbol: "SOLUSDT", Action: "open_long", Leverage: 0, // 无效 PositionSizeUSD: 100, StopLoss: 50, TakeProfit: 200, }, accountEquity: 100, btcEthLeverage: 10, altcoinLeverage: 5, wantLeverage: 0, wantError: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := validateDecision(&tt.decision, tt.accountEquity, tt.btcEthLeverage, tt.altcoinLeverage) // 检查错误状态 if (err != nil) != tt.wantError { t.Errorf("validateDecision() error = %v, wantError %v", err, tt.wantError) return } // 如果不应该报错,检查杠杆是否被正确修正 if !tt.wantError && tt.decision.Leverage != tt.wantLeverage { t.Errorf("Leverage not corrected: got %d, want %d", tt.decision.Leverage, tt.wantLeverage) } }) } } // contains 检查字符串是否包含子串(辅助函数) func contains(s, substr string) bool { return len(s) >= len(substr) && (s == substr || len(substr) == 0 || (len(s) > 0 && len(substr) > 0 && stringContains(s, substr))) } func stringContains(s, substr string) bool { for i := 0; i <= len(s)-len(substr); i++ { if s[i:i+len(substr)] == substr { return true } } return false }