package common import ( "encoding/json" "testing" ) func parse(t *testing.T, s string) []string { t.Helper() var out []string if err := json.Unmarshal([]byte(s), &out); err != nil { t.Fatalf("拼音 JSON 解析失败: %v", err) } return out } func TestAnnotatePinyin_IdiomOverride(t *testing.T) { // 词表命中整体转拼音(带声调) pys := parse(t, AnnotatePinyin("声东击西")) want := []string{"shēng", "dōng", "jī", "xī"} if len(pys) != len(want) { t.Fatalf("长度 %d != %d: %v", len(pys), len(want), pys) } for i := range want { if pys[i] != want[i] { t.Fatalf("第 %d 字 %q != %q", i, pys[i], want[i]) } } } func TestAnnotatePinyin_Alignment(t *testing.T) { // 逐字对齐:标点/非汉字对应空串 pys := parse(t, AnnotatePinyin("小明,你好!")) want := []string{"xiǎo", "míng", "", "nǐ", "hǎo", ""} if len(pys) != len(want) { t.Fatalf("长度 %d != %d: %v", len(pys), len(want), pys) } for i := range want { if pys[i] != want[i] { t.Fatalf("第 %d 字 %q != %q", i, pys[i], want[i]) } } } func TestAnnotatePinyin_NonHan(t *testing.T) { pys := parse(t, AnnotatePinyin("123abc")) if len(pys) != 6 { t.Fatalf("长度应 6,实际 %d", len(pys)) } for i, p := range pys { if p != "" { t.Fatalf("第 %d 字符应空串,实际 %q", i, p) } } } func TestAnnotatePinyin_Empty(t *testing.T) { if AnnotatePinyin("") != "[]" { t.Fatal("空文本应返回 []") } } func TestAnnotatePinyin_MissingDictRune(t *testing.T) { // 词典缺失字(兙 在 CJK 范围但 go-pinyin 词典未收录)保持空串,后续字不错位 pys := parse(t, AnnotatePinyin("兙好")) want := []string{"", "hǎo"} if len(pys) != len(want) { t.Fatalf("长度 %d != %d: %v", len(pys), len(want), pys) } for i := range want { if pys[i] != want[i] { t.Fatalf("第 %d 字 %q != %q", i, pys[i], want[i]) } } }