package service import "testing" func TestRainDays(t *testing.T) { daily := []DailyForecast{ {Date: "2026-08-12", TextDay: "小雨", TextNight: "阴"}, {Date: "2026-08-13", TextDay: "多云", TextNight: "晴"}, {Date: "2026-08-14", TextDay: "雷阵雨", TextNight: "小雨"}, } if n := RainDays(daily); n != 2 { t.Errorf("RainDays = %d, want 2", n) } if n := RainDays(nil); n != 0 { t.Errorf("空预报 RainDays = %d, want 0", n) } } func TestWeatherTextRainy(t *testing.T) { if !WeatherTextRainy("小雨") { t.Error("小雨应判为降雨") } if !WeatherTextRainy("雷阵雨") { t.Error("雷阵雨应判为降雨") } if WeatherTextRainy("晴") { t.Error("晴不应判为降雨") } } func TestFungalRisk(t *testing.T) { // 湿度 85 + 未来 2 天降雨 → 白僵病高风险 now := WeatherNow{Temp: 27, Humidity: 85, Text: "小雨"} daily := []DailyForecast{ {TextDay: "小雨"}, {TextDay: "中雨"}, {TextDay: "多云"}, } level, reason := FungalRisk(now, daily) if level != "orange" { t.Errorf("FungalRisk level = %s, want orange(原因 %s)", level, reason) } // 湿度正常 → 无 now2 := WeatherNow{Temp: 27, Humidity: 60, Text: "晴"} if l, _ := FungalRisk(now2, daily); l != "" { t.Errorf("湿度 60 不应触发白僵病: %s", l) } } func TestTempSwingRisk(t *testing.T) { if l, _ := TempSwingRisk(32); l != "yellow" { t.Errorf("32℃ 应为 yellow,实际 %s", l) } if l, _ := TempSwingRisk(18); l != "yellow" { t.Errorf("18℃ 应为 yellow,实际 %s", l) } if l, _ := TempSwingRisk(25); l != "" { t.Errorf("25℃ 不应触发,实际 %s", l) } } func TestEvaluateWeatherRules(t *testing.T) { now := WeatherNow{Temp: 32, Humidity: 85, Text: "小雨"} daily := []DailyForecast{{TextDay: "小雨"}, {TextDay: "中雨"}, {TextDay: "多云"}} alerts := EvaluateWeatherRules(now, daily, "late5") if len(alerts) == 0 { t.Fatal("高温高湿+阴雨应产生预警") } found := map[string]bool{} for _, a := range alerts { found[a.Disease] = true if a.Reason == "" { t.Errorf("预警缺少原因: %+v", a) } } if !found["白僵病"] { t.Error("缺少白僵病预警") } }