"""GENRE_CRAFT 配置单测(F1 · 品类相关 craft 片段表)。 GENRE_CRAFT 是「题材 → 语域/节奏/钩子/字数区间/常见套路」的**文本片段**映射; 品类无关内核在 `write_craft.md`,品类相关片段在此表。lookup 对未知题材优雅返回 None。 """ from __future__ import annotations from ww_config import GENRE_CRAFT, genre_craft_fragment # 与前端 wizard.ts 的 GENRES 预设保持一致(玄幻/仙侠/都市/科幻/历史/悬疑)。 _FRONTEND_GENRES = ["玄幻", "仙侠", "都市", "科幻", "历史", "悬疑"] def test_genre_craft_covers_frontend_presets() -> None: # Arrange / Act / Assert:前端每个预设题材都有对应片段。 for genre in _FRONTEND_GENRES: assert genre in GENRE_CRAFT, f"题材 {genre!r} 缺 GENRE_CRAFT 片段" def test_genre_craft_fragments_are_nonempty_text() -> None: for genre, fragment in GENRE_CRAFT.items(): assert isinstance(fragment, str) assert fragment.strip(), f"题材 {genre!r} 片段为空" def test_genre_craft_fragment_returns_matching_text() -> None: # Act fragment = genre_craft_fragment("玄幻") # Assert assert fragment is not None assert fragment == GENRE_CRAFT["玄幻"] def test_genre_craft_fragment_unknown_returns_none() -> None: assert genre_craft_fragment("不存在的题材") is None def test_genre_craft_fragment_none_returns_none() -> None: assert genre_craft_fragment(None) is None assert genre_craft_fragment("") is None def test_genre_fragments_mention_wordcount_dimension() -> None: # 每个片段应含字数/篇幅维度(灵活片段,非穷举清单)。 for genre, fragment in GENRE_CRAFT.items(): assert "字数" in fragment or "篇幅" in fragment, f"{genre!r} 片段未含字数区间"