"""app/ports.py QuestionGenerator Protocol 与 app/question_gen 公开 API 测试。"""

from __future__ import annotations

import importlib

from app.ports import QuestionGenerator


class TestQuestionGeneratorProtocol:
    def test_importable(self) -> None:
        """QuestionGenerator 可从 app.ports 导入。"""
        assert QuestionGenerator is not None

    def test_is_runtime_checkable(self) -> None:
        """QuestionGenerator 是 runtime_checkable Protocol。"""
        assert hasattr(QuestionGenerator, "__protocol_attrs__") or hasattr(
            QuestionGenerator, "__abstractmethods__"
        )

    def test_generate_method_exists(self) -> None:
        """Protocol 定义了 generate 方法。"""
        assert hasattr(QuestionGenerator, "generate")


class TestQuestionGenPublicAPI:
    def test_load_benchmark_importable_from_package(self) -> None:
        """load_benchmark 可从 app.question_gen 直接导入。"""
        mod = importlib.import_module("app.question_gen")
        assert hasattr(mod, "load_benchmark")

    def test_stratified_sample_importable_from_package(self) -> None:
        """stratified_sample 可从 app.question_gen 直接导入。"""
        mod = importlib.import_module("app.question_gen")
        assert hasattr(mod, "stratified_sample")

    def test_all_exports(self) -> None:
        """__all__ 包含预期的公开 API（v1 + v2）。"""
        mod = importlib.import_module("app.question_gen")
        assert set(mod.__all__) == {
            # v1 接口
            "load_benchmark",
            "stratified_sample",
            "TASK_TYPE_LEVEL_MAP",
            "AnchorContext",
            "generate_one",
            "sample_anchor",
            # v2 接口
            "run_pipeline_v2",
            "PipelineConfig",
            "PipelineResult",
            "QuestionFamilySpec",
            "ALL_FAMILIES",
            "CandidateQuestion",
            "generate_one_v2",
            "GateReport",
            "run_gates",
        }
