"""连浊关联模块测试。""" from pl_japanese.learner.rendaku import ( to_dakuon, to_handakuon, to_seion, rendaku_variants, find_rendaku_links, load_rendaku_marks, ) class TestDakuon: def test_seion_to_dakuon(self): assert to_dakuon('はこ') == 'ばこ' # 箱 assert to_dakuon('かみ') == 'がみ' # 紙 assert to_dakuon('と') == 'ど' assert to_dakuon('す') == 'ず' def test_no_dakuon_returns_none(self): assert to_dakuon('あき') is None # あ 不可浊化 assert to_dakuon('') is None def test_handakuon(self): assert to_handakuon('はし') == 'ぱし' assert to_handakuon('ほん') == 'ぽん' def test_handakuon_only_h_row(self): assert to_handakuon('かみ') is None # か 行无半浊 def test_to_seion(self): assert to_seion('ばこ') == 'はこ' assert to_seion('がみ') == 'かみ' assert to_seion('ぱし') == 'はし' def test_to_seion_none_for_seion(self): assert to_seion('はこ') is None # 已是清音 class TestRendakuVariants: def test_seion_variants(self): # はこ → ばこ(浊)、ぱこ(半浊) variants = rendaku_variants('はこ') assert 'ばこ' in variants assert 'ぱこ' in variants def test_dakuon_variant(self): # ばこ → はこ(清) assert 'はこ' in rendaku_variants('ばこ') class TestFindLinks: def test_links_within_dataset(self): # 数据集里同时有 はこ 和 ばこ 才建立关联 all_kana = {'はこ', 'ばこ', 'かみ', 'がみ', 'あき'} links = find_rendaku_links(all_kana) assert 'ばこ' in links['はこ'] assert 'はこ' in links['ばこ'] assert 'がみ' in links['かみ'] assert 'あき' not in links # 无变体,不建关联 def test_missing_variant_not_linked(self): # ばこ 不在数据集,はこ 不应关联到它 all_kana = {'はこ', 'かみ'} links = find_rendaku_links(all_kana) assert 'はこ' not in links # ばこ/ぱこ 都不在集合 class TestRendakuMarks: """显式连浊标注表测试(连用形连浊)。""" def test_load_marks(self): marks = load_rendaku_marks() # 表里应包含连用形连浊条目 assert marks['付|づけ'] == 'つ' assert marks['引|びき'] == 'ひ' assert marks['語|がたり'] == 'かた' def test_mark_key_format(self): """标注表 key 必须是 汉字|读音 格式。""" for key in load_rendaku_marks(): assert '|' in key, f'标注 key 缺 | 分隔: {key}'