Files
jsc-plugins/tools/corpus/test_build_pack.py
T
Jeffery (jiantw83)andClaude Sonnet 5.5 697ed6a0b9 feat: 亞絲娜與直葉的角色包 (#6, #7)
build_pack.py 產生對白索引(放在使用者資料目錄);render_skill.py 把人格卡渲染成
角色 skill 並檢查精選對白逐字來自索引;插件改成執行期從資料目錄讀索引。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 20:52:40 +00:00

55 lines
2.5 KiB
Python

import unittest
import build_pack
def rec(i, speaker="asuna", text="今天也請多指教喔", conf="high", fn="greet", vol=1, ch=1, **kw):
base = {"id": i, "volume": vol, "chapter": ch, "text": text, "before": "", "after": "", "prev_par": "", "next_par": "",
"final_speaker": speaker, "suspect_duplicate": False,
"label": {"confidence": conf, "function": fn, "emotion": "neutral"}}
base.update(kw)
return base
class Usable(unittest.TestCase):
def test_keeps_high_confidence_of_the_speaker(self):
self.assertTrue(build_pack.usable(rec("a"), "asuna"))
def test_rejects_other_speaker_low_confidence_duplicates_and_bad_length(self):
self.assertFalse(build_pack.usable(rec("a", speaker="kirito"), "asuna"))
self.assertFalse(build_pack.usable(rec("a", conf="medium"), "asuna"))
self.assertFalse(build_pack.usable(rec("a", suspect_duplicate=True), "asuna"))
self.assertFalse(build_pack.usable(rec("a", text="嗯"), "asuna"))
self.assertFalse(build_pack.usable(rec("a", text="字" * 81), "asuna"))
def test_short_other_is_dropped(self):
self.assertFalse(build_pack.usable(rec("a", text="咦咦咦咦", fn="other"), "asuna"))
class Modes(unittest.TestCase):
def test_asuna_modes(self):
self.assertEqual(build_pack.mode_asuna(rec("a", vol=1)), "ingame")
self.assertEqual(build_pack.mode_asuna(rec("a", vol=4)), "reunion")
self.assertEqual(build_pack.mode_asuna(rec("a", vol=4, before="明日奈露出笑容")), "real")
self.assertEqual(build_pack.mode_asuna(rec("a", vol=4, prev_par="須鄉冷笑著")), "captive")
def test_suguha_modes(self):
self.assertEqual(build_pack.mode_suguha(rec("a", before="莉法拔出劍")), "leafa")
self.assertEqual(build_pack.mode_suguha(rec("a", before="直葉看著和人")), "real")
self.assertIsNone(build_pack.mode_suguha(rec("a")))
class Build(unittest.TestCase):
def test_dedupes_by_text_and_fills_mode_from_chapter_majority(self):
rows = build_pack.build([
rec("a", speaker="suguha", text="我一定會贏的喔", before="莉法握緊劍", vol=3, ch=2),
rec("b", speaker="suguha", text="我一定會贏的喔", vol=3, ch=2),
rec("c", speaker="suguha", text="那我們走吧", vol=3, ch=2),
], "suguha")
self.assertEqual([r["id"] for r in rows], ["a", "c"])
self.assertEqual(rows[1]["mode"], "leafa")
if __name__ == "__main__":
unittest.main()