""" 格式校验器单元测试 确保脏数据被拦截、干净数据通过。 """ 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'])