package tradesignal import ( "strings" "testing" ) func ptr(v float64) *float64 { return &v } func TestFormatOpenIncludesPeriodAfterSymbol(t *testing.T) { out := Format(&Signal{ Symbol: "BTCUSDT", Side: "LONG", Action: "OPEN", Quantity: ptr(0.01), Price: 64000.5, Leverage: 10, Period: "1h", EventTime: "2026-06-23T01:30:00Z", }) if !strings.Contains(out, "多单开仓") || !strings.Contains(out, "交易品种: BTC") { t.Fatalf("%s", out) } idxSym := strings.Index(out, "交易品种: BTC") idxPer := strings.Index(out, "周期: 1h") idxPx := strings.Index(out, "开仓价格:") if idxPer < 0 || idxPer < idxSym || idxPx < idxPer { t.Fatalf("period placement:\n%s", out) } } func TestFormatOmitsEmptyPeriod(t *testing.T) { out := Format(&Signal{ Symbol: "BTCUSDT", Side: "LONG", Action: "OPEN", Price: 1, EventTime: "2026-06-23T01:30:00Z", }) if strings.Contains(out, "周期:") { t.Fatalf("%s", out) } } func TestFormatCloseLong(t *testing.T) { pnl, bal := 941.0, 74744.90 out := Format(&Signal{ Symbol: "BTCUSDT", Side: "LONG", Action: "CLOSE", Quantity: ptr(3), Price: 63175.76, EventTime: "2026-07-07T05:52:14Z", PnL: &pnl, AccountBalance: &bal, }) for _, want := range []string{"多单平仓", "平仓价格: 63175.76", "平仓盈亏: 941.00"} { if !strings.Contains(out, want) { t.Fatalf("missing %q in\n%s", want, out) } } } func TestFormatWithAvgPrice(t *testing.T) { avg := 150.0 out := Format(&Signal{ Symbol: "BTCUSDT", Side: "LONG", Action: "ADD", Quantity: ptr(1), Price: 200, EventTime: "2026-07-07T05:52:14Z", }, FormatOptions{AvgPrice: &avg}) if !strings.Contains(out, "平均单价: 150.00") { t.Fatalf("%s", out) } } func TestFormatTinyPriceKeepsPrecision(t *testing.T) { tp, sl := 0.00000061, 0.00000058 out := Format(&Signal{ Symbol: "PEPEUSDT", Side: "LONG", Action: "OPEN", Price: 0.00000059, TakeProfitPrice: &tp, StopLossPrice: &sl, EventTime: "2026-06-23T01:30:00Z", }) for _, want := range []string{ "开仓价格: 0.00000059\n", "止盈价格: 0.00000061\n", "止损价格: 0.00000058\n", } { if !strings.Contains(out, want) { t.Fatalf("missing %q in\n%s", want, out) } } if strings.Contains(out, "开仓价格: 0.00\n") { t.Fatalf("tiny price rounded to 0.00:\n%s", out) } }