You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

74 lines
3.2 KiB

package comm
import "testing"
// 一组典型规则:精确 > 半通配 > 全通配兜底,覆盖双向与不限区域。
func demoRules() []*CallTranslateRule {
return []*CallTranslateRule{
{Id: 1, Region: 1, SrcLangs: "zh-CN,en-US", DstLangs: "ja-JP,ko-KR", Bidir: true, AgentId: "ast-asia", Priority: 100, Enable: true},
{Id: 2, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "ast-cn-en", Priority: 90, Enable: true},
{Id: 3, Region: 1, SrcLangs: LangAny, DstLangs: "en-US", AgentId: "mt-to-en", Priority: 50, Enable: true},
{Id: 4, Region: RegionAny, SrcLangs: LangAny, DstLangs: LangAny, Bidir: true, AgentId: "mt-fallback", Priority: 10, Enable: true},
{Id: 5, Region: 1, SrcLangs: "de-DE", DstLangs: "fr-FR", AgentId: "disabled-one", Priority: 999, Enable: false},
}
}
func TestMatchCallTranslateRule(t *testing.T) {
rules := demoRules()
cases := []struct {
name string
region int32
src, dst, want string
}{
{"精确命中最高优先级", 1, "zh-CN", "ja-JP", "ast-asia"},
{"次高优先级的精确规则", 1, "zh-CN", "en-US", "ast-cn-en"},
{"源通配 + 目标精确", 1, "de-DE", "en-US", "mt-to-en"},
{"全通配兜底", 1, "de-DE", "fr-FR", "mt-fallback"},
{"双向:反向也命中同一条", 1, "ja-JP", "zh-CN", "ast-asia"},
{"其他区域只剩不限区域的兜底", 7, "zh-CN", "ja-JP", "mt-fallback"},
{"停用的规则不参与选路", 1, "de-DE", "fr-FR", "mt-fallback"},
{"宽松匹配:客户端只报主语言", 1, "zh", "ja", "ast-asia"},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := MatchCallTranslateRule(rules, c.region, c.src, c.dst)
if got == nil {
t.Fatalf("%s→%s(region=%d) 未命中任何规则,期望 %s", c.src, c.dst, c.region, c.want)
}
if got.AgentId != c.want {
t.Fatalf("%s→%s(region=%d) 命中 %s,期望 %s", c.src, c.dst, c.region, got.AgentId, c.want)
}
})
}
}
// 同优先级时精确规则应压过通配规则,避免兜底规则把精确配置吃掉。
func TestMatchPrefersSpecificOnTie(t *testing.T) {
rules := []*CallTranslateRule{
{Id: 1, Region: 1, SrcLangs: LangAny, DstLangs: LangAny, AgentId: "wildcard", Priority: 50, Enable: true},
{Id: 2, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "exact", Priority: 50, Enable: true},
}
if got := MatchCallTranslateRule(rules, 1, "zh-CN", "en-US"); got == nil || got.AgentId != "exact" {
t.Fatalf("同优先级下应选精确规则,实际 %+v", got)
}
}
// 无规则可用时必须返回 nil,让调用方走「未配置」分支而不是拿到零值。
func TestMatchNoHit(t *testing.T) {
rules := []*CallTranslateRule{
{Id: 1, Region: 1, SrcLangs: "zh-CN", DstLangs: "en-US", AgentId: "x", Priority: 10, Enable: true},
}
if got := MatchCallTranslateRule(rules, 2, "zh-CN", "en-US"); got != nil {
t.Fatalf("区域不匹配时应无命中,实际 %+v", got)
}
if got := MatchCallTranslateRule(nil, 1, "zh-CN", "en-US"); got != nil {
t.Fatalf("空规则集应无命中,实际 %+v", got)
}
}
func TestSplitLangs(t *testing.T) {
got := SplitLangs(" zh-CN , ,en-US ")
if len(got) != 2 || got[0] != "zh-CN" || got[1] != "en-US" {
t.Fatalf("SplitLangs 结果异常: %#v", got)
}
}