package hotime import "testing" func TestTruncateUA_ShortUnchanged(t *testing.T) { ua := "Mozilla/5.0 (Test)" if got := truncateUA(ua, 200); got != ua { t.Fatalf("短串不应被截断: got=%q want=%q", got, ua) } } func TestTruncateUA_LongTruncatedTo200(t *testing.T) { long := "" for i := 0; i < 300; i++ { long += "a" } got := truncateUA(long, 200) if len([]rune(got)) != 200 { t.Fatalf("截断后长度=%d want 200", len([]rune(got))) } if got != long[:200] { t.Fatalf("ASCII 截断内容不符: got=%q", got) } } func TestTruncateUA_MultiByteNotBroken(t *testing.T) { // 前 199 个 ASCII + 1 个多字节字符("中"占 3 字节),max=200 时应完整保留该 rune 而非切碎字节 prefix := "" for i := 0; i < 199; i++ { prefix += "a" } long := prefix + "中" + "extra-should-be-cut" got := truncateUA(long, 200) runes := []rune(got) if len(runes) != 200 { t.Fatalf("按 rune 截断后应为 200 个字符, got=%d (%q)", len(runes), got) } if runes[199] != '中' { t.Fatalf("第 200 个字符应为完整的 '中',实际=%q", string(runes[199])) } }