"""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} 片段未含字数区间"
