japanese/tests/test_validator.py
panli 1f64c87d0e Initial commit: 日语词表清洗工具(任务化架构)
- 任务化清洗流程:Task/TaskManager + BatchProcessor 三方法
- 数据目录规范化:data/{db,sources,backup}
- CLI 入口移进包,注册 jclean 命令
- 工作流测试驱动(tests/test_cleaner_workflow.py)
- 40 测试通过
2026-08-19 15:04:18 +08:00

77 lines
2.3 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
assert "长度" 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'])