build_pack.py 產生對白索引(放在使用者資料目錄);render_skill.py 把人格卡渲染成 角色 skill 並檢查精選對白逐字來自索引;插件改成執行期從資料目錄讀索引。 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
55 lines
2.5 KiB
Python
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()
|