Spaces:
Running
Running
| from __future__ import annotations | |
| import sys | |
| import unicodedata | |
| from pathlib import Path | |
| sys.path.insert(0, str(Path(__file__).parent)) | |
| from pronoun_harmonizer_v9 import harmonize_pronouns_v9 # noqa: E402 | |
| from pronoun_harmonizer_v9 import classify_route_for_rows # noqa: E402 | |
| _pass = 0 | |
| _fail = 0 | |
| def norm(text: str) -> str: | |
| return unicodedata.normalize("NFC", text) | |
| def check_rows(name: str, rows: list[tuple[int, str, str]], expected: list[str]) -> None: | |
| global _pass, _fail | |
| got_rows, report = harmonize_pronouns_v9(rows) | |
| got = [row[2] for row in got_rows] | |
| if [norm(item) for item in got] == [norm(item) for item in expected]: | |
| _pass += 1 | |
| return | |
| _fail += 1 | |
| print(f"FAIL [{name}] report={report}") | |
| for index, (g, e) in enumerate(zip(got, expected), start=1): | |
| if norm(g) != norm(e): | |
| print(f" row {index}\n expected={e!r}\n got ={g!r}") | |
| def check_rows_route( | |
| name: str, | |
| rows: list[tuple[int, str, str]], | |
| expected: list[str], | |
| *, | |
| route: str, | |
| ) -> None: | |
| global _pass, _fail | |
| got_rows, report = harmonize_pronouns_v9(rows, route=route) | |
| got = [row[2] for row in got_rows] | |
| if [norm(item) for item in got] == [norm(item) for item in expected]: | |
| _pass += 1 | |
| return | |
| _fail += 1 | |
| print(f"FAIL [{name}] report={report}") | |
| for index, (g, e) in enumerate(zip(got, expected), start=1): | |
| if norm(g) != norm(e): | |
| print(f" row {index}\n expected={e!r}\n got ={g!r}") | |
| def check_route(name: str, rows: list[tuple[int, str, str]], expected_route: str) -> None: | |
| global _pass, _fail | |
| route, reason = classify_route_for_rows(rows) | |
| if route == expected_route: | |
| _pass += 1 | |
| return | |
| _fail += 1 | |
| print(f"FAIL [{name}] expected_route={expected_route!r} got={route!r} reason={reason!r}") | |
| print("=" * 70) | |
| print("PRONOUN HARMONIZER V9") | |
| print("=" * 70) | |
| check_rows( | |
| "teacher/student", | |
| [ | |
| ( | |
| 1, | |
| "回到班级,高一三班的王海老师敲了敲黑板:“同学们,安静!我是你们的班主任。你们听明白了吗?”", | |
| "Giáo viên Vương Hải gõ bảng: “Các ngươi, yên lặng! Ta là chủ nhiệm lớp của các ngươi. Các ngươi nghe rõ chưa?”", | |
| ) | |
| ], | |
| [ | |
| "Giáo viên Vương Hải gõ bảng: “Các em, yên lặng! Thầy là chủ nhiệm lớp của các em. Các em nghe rõ chưa?”", | |
| ], | |
| ) | |
| check_rows( | |
| "teacher looking at student", | |
| [ | |
| ( | |
| 1, | |
| "老师看着学生说道:“你必须努力。”", | |
| "Giáo viên nhìn học sinh nói: “Ngươi phải nỗ lực.”", | |
| ), | |
| ( | |
| 2, | |
| "王老师看着他说:“你必须努力。”", | |
| "Thầy Vương nhìn hắn nói: “Ngươi phải nỗ lực.”", | |
| ), | |
| ], | |
| [ | |
| "Giáo viên nhìn học sinh nói: “Em phải nỗ lực.”", | |
| "Thầy Vương nhìn hắn nói: “Em phải nỗ lực.”", | |
| ], | |
| ) | |
| check_rows( | |
| "teacher peer guard", | |
| [ | |
| ( | |
| 1, | |
| "王老师看着李老师说道:“你觉得怎么样?”", | |
| "Thầy Vương nhìn thầy Lý nói: “Ngươi thấy thế nào?”", | |
| ) | |
| ], | |
| [ | |
| "Thầy Vương nhìn thầy Lý nói: “Ngươi thấy thế nào?”", | |
| ], | |
| ) | |
| check_rows( | |
| "peer after teacher window", | |
| [ | |
| ( | |
| 1, | |
| "坐在旁边的白真真拉了拉张宇的衣角,小声嘀咕:“王老师也太严了吧。喂,你准备得怎么样了?像我这种垫底的,这次死定了。”", | |
| "Bạch Chân Chân kéo góc áo Trương Vũ: “Vương lão sư quá nghiêm rồi. Này, ngươi chuẩn bị thế nào rồi? Loại đội sổ như ta, lần này chết chắc rồi.”", | |
| ) | |
| ], | |
| [ | |
| "Bạch Chân Chân kéo góc áo Trương Vũ: “Vương lão sư quá nghiêm rồi. Này, cậu chuẩn bị thế nào rồi? Loại đội sổ như tớ, lần này chết chắc rồi.”", | |
| ], | |
| ) | |
| check_rows( | |
| "inner monologue keeps ta", | |
| [ | |
| ( | |
| 1, | |
| "看着坐在自己面前正在喝粥的少女,张羽心道:“对方和我是朋友?”", | |
| "Nhìn thiếu nữ đang ngồi uống cháo trước mặt mình, Trương Vũ thầm nghĩ: “Đối phương với ta là bạn?”", | |
| ), | |
| ( | |
| 2, | |
| "“因为我是年级前十?难道这就是所谓的学霸圈子?”", | |
| "“Bởi vì ta là top 10 khối? Chẳng lẽ đây chính là cái gọi là giới học bá?”", | |
| ), | |
| ], | |
| [ | |
| "Nhìn thiếu nữ đang ngồi uống cháo trước mặt mình, Trương Vũ thầm nghĩ: “Đối phương với ta là bạn?”", | |
| "“Bởi vì ta là top 10 khối? Chẳng lẽ đây chính là cái gọi là giới học bá?”", | |
| ], | |
| ) | |
| check_rows( | |
| "child to mother", | |
| [ | |
| ( | |
| 1, | |
| "他赶紧迎了上去,接过保温盒:“妈,您怎么亲自来了?下次您打个电话,我们就回家看您了。”", | |
| "Hắn vội vàng tiến lên: “Mẹ, ngài sao lại đích thân đến? Lần sau ngài gọi điện thoại, chúng ta về nhà thăm ngài.”", | |
| ) | |
| ], | |
| [ | |
| "Hắn vội vàng tiến lên: “Mẹ, mẹ sao lại đích thân đến? Lần sau mẹ gọi điện thoại, chúng con về nhà thăm mẹ.”", | |
| ], | |
| ) | |
| check_rows( | |
| "xianxia copy guard", | |
| [ | |
| ( | |
| 1, | |
| "你这修士好大胆,竟敢闯灵气禁地。", | |
| "Cậu tu sĩ này to gan, dám xông vào cấm địa linh khí.", | |
| ) | |
| ], | |
| [ | |
| "Cậu tu sĩ này to gan, dám xông vào cấm địa linh khí.", | |
| ], | |
| ) | |
| check_rows( | |
| "historical copy guard", | |
| [ | |
| ( | |
| 1, | |
| "皇帝说道:“你听我说。”", | |
| "Hoàng đế nói: “Ngươi nghe ta nói.”", | |
| ) | |
| ], | |
| [ | |
| "Hoàng đế nói: “Ngươi nghe ta nói.”", | |
| ], | |
| ) | |
| check_rows( | |
| "xianxia family copy guard", | |
| [ | |
| ( | |
| 1, | |
| "宗门内,哥哥对妹妹说:“我会帮你。”", | |
| "Trong tông môn, anh trai nói với em gái: “Tôi sẽ giúp cậu.”", | |
| ) | |
| ], | |
| [ | |
| "Trong tông môn, anh trai nói với em gái: “Tôi sẽ giúp cậu.”", | |
| ], | |
| ) | |
| check_route( | |
| "meiqian title is modern route hint", | |
| [ | |
| ( | |
| 1, | |
| "书名:没钱修什么仙?", | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| ) | |
| ], | |
| "modern_school", | |
| ) | |
| check_rows( | |
| "meiqian interview window", | |
| [ | |
| ( | |
| 1, | |
| "中间的面试官望着他,淡淡道:“你为什么要报考我们的学校?”", | |
| "Giám khảo phỏng vấn ở giữa nhìn hắn, thản nhiên nói: “Ngươi vì sao muốn thi vào trường của chúng ta?”", | |
| ), | |
| ( | |
| 2, | |
| "他想了想,随意问道:“你现在每天睡多久?”", | |
| "Hắn suy nghĩ một chút, tùy ý hỏi: “Ngươi bây giờ mỗi ngày ngủ bao lâu?”", | |
| ), | |
| ( | |
| 3, | |
| "张羽连忙说道:“我会努力追赶上他们的。”", | |
| "Trương Vũ vội vàng nói: “Ta sẽ cố gắng đuổi kịp bọn họ.”", | |
| ), | |
| ( | |
| 4, | |
| "一旁的女面试官笑了笑:“我看他什么都不知道就来了。”", | |
| "Nữ giám khảo phỏng vấn bên cạnh cười cười: “Ta thấy hắn chẳng biết gì liền tới đây.”", | |
| ), | |
| ], | |
| [ | |
| "Giám khảo phỏng vấn ở giữa nhìn hắn, thản nhiên nói: “Em vì sao muốn thi vào trường của chúng tôi?”", | |
| "Hắn suy nghĩ một chút, tùy ý hỏi: “Em bây giờ mỗi ngày ngủ bao lâu?”", | |
| "Trương Vũ vội vàng nói: “Em sẽ cố gắng đuổi kịp bọn họ.”", | |
| "Nữ giám khảo phỏng vấn bên cạnh cười cười: “Tôi thấy hắn chẳng biết gì liền tới đây.”", | |
| ], | |
| ) | |
| check_rows( | |
| "institution pitch continuation", | |
| [ | |
| ( | |
| 1, | |
| "“同学,你算是来对地方了,我们这就是最适合你这种平民天才的高中。", | |
| "“Bạn học, bạn đến đúng chỗ rồi, chúng ta đây chính là trường cấp ba phù hợp nhất với thiên tài bình dân như bạn.”", | |
| ), | |
| ( | |
| 2, | |
| "就连空气循环系统中也充斥着神经兴奋填充剂,让你再也无需睡眠,而这些全都是免费的。", | |
| "Ngay cả trong hệ thống tuần hoàn không khí cũng tràn ngập chất đầy phấn khích thần kinh, khiến ngươi không cần ngủ nữa, mà tất cả đều miễn phí.", | |
| ), | |
| ( | |
| 3, | |
| "当然,想要承受这些功能增强补充药剂,你必须在我们指定的医院完成改造。", | |
| "Đương nhiên, muốn chịu đựng những dược tề bổ sung chức năng này, ngươi phải hoàn thành cải tạo tại bệnh viện do chúng ta chỉ định.", | |
| ), | |
| ], | |
| [ | |
| "“Bạn học, bạn đến đúng chỗ rồi, chúng tôi đây chính là trường cấp ba phù hợp nhất với thiên tài bình dân như bạn.”", | |
| "Ngay cả trong hệ thống tuần hoàn không khí cũng tràn ngập chất đầy phấn khích thần kinh, khiến em không cần ngủ nữa, mà tất cả đều miễn phí.", | |
| "Đương nhiên, muốn chịu đựng những dược tề bổ sung chức năng này, em phải hoàn thành cải tạo tại bệnh viện do chúng tôi chỉ định.", | |
| ], | |
| ) | |
| check_rows( | |
| "mother message lookahead", | |
| [ | |
| ( | |
| 1, | |
| "简介:老者:“你想报仇?”少年:“我被强者反复侮辱。”", | |
| "Giới thiệu: Lão giả: “Ngươi muốn báo thù?” Thiếu niên: “Ta bị cường giả sỉ nhục nhiều lần.”", | |
| ), | |
| ( | |
| 2, | |
| "“不要紧张,你成绩这么好,一定能过的。”", | |
| "“Đừng căng thẳng, thành tích của ngươi tốt như vậy, nhất định sẽ vượt qua.”", | |
| ), | |
| ( | |
| 3, | |
| "“手术费的事情不用担心,妈找了个新兼职,一定会帮你凑齐的。”", | |
| "“Chuyện phí phẫu thuật không cần lo lắng, mẹ tìm được một công việc làm thêm mới, nhất định sẽ giúp con gom đủ.”", | |
| ), | |
| ( | |
| 4, | |
| "看着屏幕上母亲发来的消息,张羽默默收起手机。", | |
| "Nhìn tin nhắn mẹ gửi tới trên màn hình, Trương Vũ lặng lẽ cất điện thoại đi.", | |
| ), | |
| ], | |
| [ | |
| "Giới thiệu: Lão giả: “Ngươi muốn báo thù?” Thiếu niên: “Ta bị cường giả sỉ nhục nhiều lần.”", | |
| "“Đừng căng thẳng, thành tích của con tốt như vậy, nhất định sẽ vượt qua.”", | |
| "“Chuyện phí phẫu thuật không cần lo lắng, mẹ tìm được một công việc làm thêm mới, nhất định sẽ giúp con gom đủ.”", | |
| "Nhìn tin nhắn mẹ gửi tới trên màn hình, Trương Vũ lặng lẽ cất điện thoại đi.", | |
| ], | |
| ) | |
| check_rows( | |
| "child mother vocative opens window", | |
| [ | |
| ( | |
| 1, | |
| "书名:没钱修什么仙?", | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| ), | |
| ( | |
| 2, | |
| "“妈,对不起。”", | |
| "“Mẹ, xin lỗi.”", | |
| ), | |
| ( | |
| 3, | |
| "“但我真的想修仙啊。”", | |
| "“Nhưng ta thật sự muốn tu tiên mà.”", | |
| ), | |
| ( | |
| 4, | |
| "“哪怕欠上一辈子还不上欠债,我也想修仙……”", | |
| "“Dù có nợ cả đời không trả nổi nợ, ta cũng muốn tu tiên...”", | |
| ), | |
| ], | |
| [ | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| "“Mẹ, xin lỗi.”", | |
| "“Nhưng con thật sự muốn tu tiên mà.”", | |
| "“Dù có nợ cả đời không trả nổi nợ, con cũng muốn tu tiên...”", | |
| ], | |
| ) | |
| check_rows( | |
| "older brother younger sister dialogue", | |
| [ | |
| ( | |
| 1, | |
| '哥哥看着站在门口的妹妹,叹了口气说:"你昨天去哪儿了?妈妈很担心你。"', | |
| 'Anh trai nhìn em gái đang đứng ở cửa, thở dài nói: "Hôm qua em đi đâu vậy? Mẹ rất lo lắng cho em."', | |
| ), | |
| ( | |
| 2, | |
| '"我只是去见了一个朋友,他是我大学同学。" 她低着头,不敢看他的眼睛。', | |
| '"Tôi chỉ đi gặp một người bạn, anh ấy là bạn học đại học của tôi." Cô cúi đầu, không dám nhìn vào mắt anh.', | |
| ), | |
| ( | |
| 3, | |
| '"那个男人值得你这样吗?他对你根本不好!" 他突然提高了音量。', | |
| '"Người đàn ông đó đáng để ngươi làm vậy sao? Hắn đối xử với ngươi hoàn toàn không tốt!" Hắn đột nhiên nâng cao âm lượng.', | |
| ), | |
| ( | |
| 4, | |
| '"你根本不懂!这是我和他之间的事情,不需要你来管。"', | |
| '"Ngươi căn bản không hiểu! Đây là chuyện giữa ta và hắn, không cần ngươi quản."', | |
| ), | |
| ( | |
| 5, | |
| '"我是你哥,我不管你谁管你?难道看着你被别人欺负?"', | |
| '"Ta là anh trai ngươi, ta không quản ngươi ai quản ngươi? Chẳng lẽ nhìn ngươi bị người khác bắt nạt?"', | |
| ), | |
| ], | |
| [ | |
| 'Anh trai nhìn em gái đang đứng ở cửa, thở dài nói: "Hôm qua em đi đâu vậy? Mẹ rất lo lắng cho em."', | |
| '"Em chỉ đi gặp một người bạn, anh ấy là bạn học đại học của em." Cô cúi đầu, không dám nhìn vào mắt anh.', | |
| '"Người đàn ông đó đáng để em làm vậy sao? Hắn đối xử với em hoàn toàn không tốt!" Hắn đột nhiên nâng cao âm lượng.', | |
| '"Anh căn bản không hiểu! Đây là chuyện giữa em và hắn, không cần anh quản."', | |
| '"Anh là anh trai em, anh không quản em ai quản em? Chẳng lẽ nhìn em bị người khác bắt nạt?"', | |
| ], | |
| ) | |
| check_rows( | |
| "stylized ad keeps xianxia pronouns", | |
| [ | |
| ( | |
| 1, | |
| "简介:老者:“你想报仇?”少年:“我被强者反复侮辱,被师尊视为垃圾,我怎么可能不想报仇?”老者伸出手:“把你手机给我。”", | |
| "Giới thiệu: Lão giả: “Ngươi muốn báo thù?” Thiếu niên: “Ta bị cường giả sỉ nhục, bị sư tôn coi như rác rưởi, ta sao có thể không muốn báo thù?” Lão giả duỗi tay: “Đưa điện thoại của ngươi cho ta.”", | |
| ) | |
| ], | |
| [ | |
| "Giới thiệu: Lão giả: “Ngươi muốn báo thù?” Thiếu niên: “Ta bị cường giả sỉ nhục, bị sư tôn coi như rác rưởi, ta sao có thể không muốn báo thù?” Lão giả duỗi tay: “Đưa điện thoại của ngươi cho ta.”", | |
| ], | |
| ) | |
| check_rows( | |
| "teacher as object no-op", | |
| [ | |
| ( | |
| 1, | |
| "你见过老师吗?", | |
| "Cậu đã gặp giáo viên chưa?", | |
| ) | |
| ], | |
| [ | |
| "Cậu đã gặp giáo viên chưa?", | |
| ], | |
| ) | |
| check_rows( | |
| "teacher as object with forbidden pronoun still no-op", | |
| [ | |
| ( | |
| 1, | |
| "你见过老师吗?", | |
| "Ngươi đã gặp thầy chưa?", | |
| ) | |
| ], | |
| [ | |
| "Ngươi đã gặp thầy chưa?", | |
| ], | |
| ) | |
| check_rows( | |
| "teacher as quoted object with non-teacher speaker no-op", | |
| [ | |
| ( | |
| 1, | |
| "师兄说:“你见过老师吗?”", | |
| 'Sư huynh nói: "Ngươi đã gặp giáo viên chưa?"', | |
| ) | |
| ], | |
| [ | |
| 'Sư huynh nói: "Ngươi đã gặp giáo viên chưa?"', | |
| ], | |
| ) | |
| check_rows_route( | |
| "teacher object statements do not become student self", | |
| [ | |
| ( | |
| 1, | |
| "我见过老师。", | |
| "Ta đã gặp giáo viên.", | |
| ), | |
| ( | |
| 2, | |
| "张羽说:“我见过老师。”", | |
| "Ta đã gặp giáo viên.", | |
| ), | |
| ], | |
| [ | |
| "Ta đã gặp giáo viên.", | |
| "Ta đã gặp giáo viên.", | |
| ], | |
| route="modern_school", | |
| ) | |
| check_rows_route( | |
| "student addressing teacher still becomes em", | |
| [ | |
| ( | |
| 1, | |
| "张羽对老师说:“我会努力。”", | |
| "Ta sẽ cố gắng.", | |
| ), | |
| ( | |
| 2, | |
| "“老师,我会努力。”", | |
| "Ta sẽ cố gắng.", | |
| ), | |
| ], | |
| [ | |
| "Em sẽ cố gắng.", | |
| "Em sẽ cố gắng.", | |
| ], | |
| route="modern_school", | |
| ) | |
| check_rows_route( | |
| "teacher student dialogue window keeps roles", | |
| [ | |
| ( | |
| 1, | |
| "张老师看着眼前的学生,问道:“你明天的考试准备好了吗?”", | |
| 'Thầy Trương nhìn học sinh trước mặt, hỏi: "Kỳ thi ngày mai em đã chuẩn bị xong chưa?"', | |
| ), | |
| ( | |
| 2, | |
| "“我已经复习完了,老师。”我恭敬地回答道。", | |
| '"Em đã ôn tập xong rồi, lão sư." Em cung kính trả lời.', | |
| ), | |
| ( | |
| 3, | |
| "“你是个聪明的孩子,我相信你。”老师拍了拍我的肩膀。", | |
| "“Em là một đứa trẻ thông minh, anh tin em.” Thầy giáo vỗ vai thầy.", | |
| ), | |
| ], | |
| [ | |
| 'Thầy Trương nhìn học sinh trước mặt, hỏi: "Kỳ thi ngày mai em đã chuẩn bị xong chưa?"', | |
| '"Em đã ôn tập xong rồi, thầy." Em cung kính trả lời.', | |
| "“Em là một đứa trẻ thông minh, thầy tin em.” Thầy giáo vỗ vai em.", | |
| ], | |
| route="modern_school", | |
| ) | |
| check_rows_route( | |
| "teacher student con variant normalizes to em", | |
| [ | |
| ( | |
| 1, | |
| "张老师看着眼前的学生,问道:“你明天的考试准备好了吗?”", | |
| 'Trương lão sư nhìn học sinh trước mắt, hỏi: "Kỳ thi ngày mai con chuẩn bị xong chưa?"', | |
| ), | |
| ( | |
| 2, | |
| "“我已经复习完了,老师。”我恭敬地回答道。", | |
| '"Con đã ôn tập xong rồi, thưa thầy." Con cung kính trả lời.', | |
| ), | |
| ( | |
| 3, | |
| "“你是个聪明的孩子,我相信你。”老师拍了拍我的肩膀。", | |
| '"Con là một đứa trẻ thông minh, ta tin con." Thầy giáo vỗ vai ta.', | |
| ), | |
| ], | |
| [ | |
| 'Thầy Trương nhìn học sinh trước mắt, hỏi: "Kỳ thi ngày mai em chuẩn bị xong chưa?"', | |
| '"Em đã ôn tập xong rồi, thưa thầy." Em cung kính trả lời.', | |
| '"Em là một đứa trẻ thông minh, thầy tin em." Thầy giáo vỗ vai em.', | |
| ], | |
| route="modern_school", | |
| ) | |
| check_rows( | |
| "boss spouse and embedded classical tv split registers", | |
| [ | |
| ( | |
| 1, | |
| "林总裁冷冷地对小李说:“你明天必须把报告交给我,否则后果自负。”", | |
| "Tổng tài Lâm lạnh lùng nói với Tiểu Lý: “Ngươi ngày mai phải nộp báo cáo cho ta, nếu không tự gánh hậu quả.”", | |
| ), | |
| ( | |
| 2, | |
| "下班后,林总裁回到家,换上一副温和的笑脸对妻子说:“老婆,我回来了。你今天过得怎么样?”", | |
| "Sau khi tan làm, tổng tài Lâm về nhà, dịu dàng nói với vợ: “Vợ à, ta về rồi. Ngươi hôm nay thế nào?”", | |
| ), | |
| ( | |
| 3, | |
| "此时,客厅的电视里正播放着热播的古装剧。屏幕里的妃子哭喊着:“皇上,臣妾做不到啊!你为何如此狠心!”", | |
| "Lúc này, TV trong phòng khách đang chiếu phim cổ trang. Phi tử trong màn hình khóc: “Hoàng thượng, thần thiếp không làm được! Ngươi vì sao nhẫn tâm như vậy!”", | |
| ), | |
| ( | |
| 4, | |
| "林总裁摇了摇头,对妻子说:“现在的电视剧,台词真夸张。”", | |
| "Tổng tài Lâm lắc đầu, nói với vợ: “Phim truyền hình bây giờ, lời thoại thật khoa trương.”", | |
| ), | |
| ], | |
| [ | |
| "Tổng tài Lâm lạnh lùng nói với Tiểu Lý: “Cậu ngày mai phải nộp báo cáo cho tôi, nếu không tự gánh hậu quả.”", | |
| "Sau khi tan làm, tổng tài Lâm về nhà, dịu dàng nói với vợ: “Vợ à, anh về rồi. Em hôm nay thế nào?”", | |
| "Lúc này, TV trong phòng khách đang chiếu phim cổ trang. Phi tử trong màn hình khóc: “Hoàng thượng, thần thiếp không làm được! Ngươi vì sao nhẫn tâm như vậy!”", | |
| "Tổng tài Lâm lắc đầu, nói với vợ: “Phim truyền hình bây giờ, lời thoại thật khoa trương.”", | |
| ], | |
| ) | |
| romance_rows = [ | |
| ( | |
| 1, | |
| "男孩紧紧抱住女孩,温柔地说:“我永远不会离开你。”", | |
| "Chàng trai ôm chặt cô gái, dịu dàng nói: “Ta vĩnh viễn sẽ không rời khỏi ngươi.”", | |
| ), | |
| ( | |
| 2, | |
| "“你发誓?”女孩抬头看着他,眼中闪烁着泪光。", | |
| "“Ngươi thề chứ?” cô gái ngẩng đầu nhìn hắn, trong mắt lấp lánh lệ quang.", | |
| ), | |
| ( | |
| 3, | |
| "“我发誓。为了你,我什么都愿意做。”他轻轻吻了她的额头,“你是我这辈子最重要的人。”", | |
| "“Ta thề. Vì ngươi, ta cái gì cũng nguyện ý làm.” Hắn nhẹ nhàng hôn trán nàng, “Ngươi là người quan trọng nhất đời ta.”", | |
| ), | |
| ] | |
| check_route( | |
| "boy girl romance opens modern route", | |
| romance_rows, | |
| "modern_school", | |
| ) | |
| check_rows( | |
| "boy girl romance keeps anh em roles", | |
| romance_rows, | |
| [ | |
| "Chàng trai ôm chặt cô gái, dịu dàng nói: “Anh vĩnh viễn sẽ không rời khỏi em.”", | |
| "“Anh thề chứ?” cô gái ngẩng đầu nhìn hắn, trong mắt lấp lánh lệ quang.", | |
| "“Anh thề. Vì em, anh cái gì cũng nguyện ý làm.” Hắn nhẹ nhàng hôn trán cô ấy, “Em là người quan trọng nhất đời anh.”", | |
| ], | |
| ) | |
| check_rows( | |
| "mother as object no-op in modern route", | |
| [ | |
| ( | |
| 1, | |
| "书名:没钱修什么仙?", | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| ), | |
| ( | |
| 2, | |
| "你见过我妈妈吗?", | |
| "Cậu đã gặp mẹ tôi chưa?", | |
| ), | |
| ], | |
| [ | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| "Cậu đã gặp mẹ tôi chưa?", | |
| ], | |
| ) | |
| check_rows_route( | |
| "mother term with separate she is no-op", | |
| [ | |
| ( | |
| 1, | |
| "妈妈在公司看见她。", | |
| "Mẹ ở công ty nhìn nàng.", | |
| ), | |
| ( | |
| 2, | |
| "母亲走进房间,她看起来很累。", | |
| "Mẹ bước vào phòng, nàng trông rất mệt.", | |
| ), | |
| ], | |
| [ | |
| "Mẹ ở công ty nhìn nàng.", | |
| "Mẹ bước vào phòng, nàng trông rất mệt.", | |
| ], | |
| route="modern_school", | |
| ) | |
| check_rows( | |
| "xiaojie does not open sibling window and blank resets context", | |
| [ | |
| ( | |
| 1, | |
| "书名:没钱修什么仙?", | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| ), | |
| ( | |
| 2, | |
| "小姐离开了。", | |
| "Tiểu thư rời đi.", | |
| ), | |
| ( | |
| 3, | |
| "“我会帮你。”他说。", | |
| "“Ta sẽ giúp ngươi.” anh ấy nói.", | |
| ), | |
| ( | |
| 4, | |
| "", | |
| "", | |
| ), | |
| ( | |
| 5, | |
| "“我不知道你在说什么。”", | |
| "“Ta không biết ngươi đang nói gì.”", | |
| ), | |
| ], | |
| [ | |
| "Tên sách: Không có tiền tu tiên gì?", | |
| "Tiểu thư rời đi.", | |
| "“Ta sẽ giúp ngươi.” anh ấy nói.", | |
| "", | |
| "“Ta không biết ngươi đang nói gì.”", | |
| ], | |
| ) | |
| print(f"KẾT QUẢ: {_pass} PASS / {_fail} FAIL") | |
| if _fail: | |
| raise AssertionError(f"pronoun_harmonizer_v9 suite failed: {_fail}") | |
| if __name__ == "__main__": | |
| sys.exit(0) | |