"""T6 创作工具箱 · 7 个文本生成器的 spec 契约测试。

契约测试——校验每个 spec 的 name/tier/reads/writes/output_schema/scope/input_schema，
对齐不变量 #2（只声明 tier）/ #3（writes 经验收才生效）。不联网、无 DB。
"""

from __future__ import annotations

import pytest
from ww_agents import (
    AgentSpec,
    BlurbResult,
    DetailedOutlineResult,
    GlossaryResult,
    GoldenFingerResult,
    NameListResult,
    OpeningResult,
    TitleListResult,
    blurb_spec,
    book_title_spec,
    fine_outline_spec,
    glossary_spec,
    golden_finger_spec,
    name_spec,
    opening_spec,
)

# (spec, name, tier, reads, writes, output_schema)
_TOOLBOX_SPECS = [
    (book_title_spec, "book-title", "light", ["projects"], [], TitleListResult),
    (blurb_spec, "blurb", "analyst", ["projects"], [], BlurbResult),
    (name_spec, "name", "light", ["projects", "world_entities", "characters"], [], NameListResult),
    (
        golden_finger_spec,
        "golden-finger",
        "writer",
        ["projects", "world_entities"],
        ["world_entities"],
        GoldenFingerResult,
    ),
    (
        glossary_spec,
        "glossary",
        "analyst",
        ["projects", "world_entities"],
        ["world_entities"],
        GlossaryResult,
    ),
    (opening_spec, "opening", "writer", ["projects", "outline"], [], OpeningResult),
    (
        fine_outline_spec,
        "fine-outline",
        "analyst",
        ["projects", "outline"],
        ["outline"],
        DetailedOutlineResult,
    ),
]


@pytest.mark.parametrize(
    ("spec", "name", "tier", "reads", "writes", "output_schema"),
    _TOOLBOX_SPECS,
)
def test_toolbox_spec_declares_expected_contract(
    spec: AgentSpec,
    name: str,
    tier: str,
    reads: list[str],
    writes: list[str],
    output_schema: type,
) -> None:
    assert spec.name == name
    assert spec.tier == tier
    assert list(spec.reads) == reads
    assert list(spec.writes) == writes
    assert spec.output_schema is output_schema
    assert spec.scope == "builtin"
    assert spec.input_schema is None  # 注入材料为序列化文本，非结构化入参


@pytest.mark.parametrize("spec", [row[0] for row in _TOOLBOX_SPECS])
def test_toolbox_spec_has_nonempty_system_prompt(spec: AgentSpec) -> None:
    assert spec.system_prompt.strip()
