新增学习资料生成器模块(learner),从权威库生成多维日语学习资料: - 拼音/假名/汉字/熟字训四类索引,带拼音↔假名↔汉字交叉跳转 - 逐字音训分类(KANJIDIC2 精确查表 + 启发式回退 + 排序键) - 音变标注体系:浊化(連濁)、半浊化、促音变(促音便)、连声(れんじょう) 独立配色 + 合并逻辑 + 音变规律说明 - 显式标注表:rendaku_marks(连用形连浊)、renjou_marks(连声) - 每索引独立例词数配置(jlearn.toml + --config) - HTML 单页应用 + 静态 HTML + PDF(playwright) 清洗工具增强: - 拼音校验器(pinyin_checker)集成到 jclean - 多音字拼音校正、ます形サ変動詞转原型 数据: - 权威库补充连声词(反応/天皇/陰陽/観音/因縁/三位/輪廻/安穏) - KANJIDIC2 音训分类表、拼音校正字典 整理 .gitignore:忽略生成产物(output/study_materials)、词典数据库、 任务运行日志、备份文件
78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
"""
|
|
格式校验器单元测试
|
|
确保脏数据被拦截、干净数据通过。
|
|
"""
|
|
import pytest
|
|
|
|
from pl_japanese.cleaner.validator import clean_line, validate_line
|
|
|
|
|
|
class TestCleanLine:
|
|
"""行清理:去行号前缀、注释后缀"""
|
|
|
|
def test_strip_line_number(self):
|
|
assert clean_line("L123 中|国:ちゅう|ごく:zhong|guo") == "中|国:ちゅう|ごく:zhong|guo"
|
|
|
|
def test_strip_comment(self):
|
|
assert clean_line("中|国:ちゅう|ごく:zhong|guo # 备注") == "中|国:ちゅう|ごく:zhong|guo"
|
|
|
|
def test_strip_both(self):
|
|
assert clean_line("L5 中|国:ちゅう|ごく:zhong|guo # x") == "中|国:ちゅう|ごく:zhong|guo"
|
|
|
|
def test_plain_line(self):
|
|
assert clean_line("中|国:ちゅう|ごく:zhong|guo") == "中|国:ちゅう|ごく:zhong|guo"
|
|
|
|
|
|
class TestValidateValid:
|
|
"""合格数据应通过"""
|
|
|
|
@pytest.mark.parametrize("s", [
|
|
"中|国:ちゅう|ごく:zhong|guo",
|
|
"食|べる:た|べる:shi|", # 假名段拼音留空
|
|
"U|ターン:ユー|ターン:u|", # 字母+片假名
|
|
"日|本|語:に|ほん|ご:ri|ben|yu",
|
|
])
|
|
def test_valid_lines(self, s):
|
|
ok, reason = validate_line(s)
|
|
assert ok, f"应通过但被拒绝: {reason}"
|
|
|
|
|
|
class TestValidateReject:
|
|
"""脏数据应被拒绝"""
|
|
|
|
def test_reject_question_mark(self):
|
|
ok, reason = validate_line("青|島:チンタオビール:?")
|
|
assert not ok
|
|
assert "?" in reason
|
|
|
|
def test_reject_comment_marker(self):
|
|
ok, reason = validate_line("[原] これから:これから:")
|
|
assert not ok
|
|
|
|
def test_reject_wrong_colon_count(self):
|
|
ok, reason = validate_line("CS公司:シーエス|コン|ス:|gong|si")
|
|
assert not ok
|
|
|
|
def test_reject_length_mismatch(self):
|
|
# 3 个冒号段但分段数不一致
|
|
ok, reason = validate_line("大|量:たい:da|liang")
|
|
assert not ok
|
|
# 新版给出更具体的提示:"假名需要分割成2段"或"长度不匹配"
|
|
assert ("分割" in reason or "长度" in reason)
|
|
|
|
def test_reject_empty(self):
|
|
ok, reason = validate_line("")
|
|
assert not ok
|
|
|
|
def test_reject_empty_kanji(self):
|
|
ok, reason = validate_line(":ちゅう:zhong")
|
|
assert not ok
|
|
|
|
def test_reject_empty_kana(self):
|
|
ok, reason = validate_line("中::zhong")
|
|
assert not ok
|
|
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main([__file__, '-v'])
|