"""Tests für {{key|d}}, {{key|x}}, ai_caption und Unbekannt-Erkennung.""" from placeholder_registry import ( PlaceholderMetadata, PlaceholderType, OutputType, build_ai_placeholder_caption, ) import placeholder_resolver as pr from placeholder_resolver import format_value_with_d_modifier from prompt_executor import resolve_placeholders def test_build_ai_caption_is_explanation_only(): m = PlaceholderMetadata( key="test_x", category="Test", description="Kurzbeschreibung", resolver_module="m", resolver_function="f", semantic_contract="Lang Vertrag " * 50, business_meaning="Kernbedeutung für die KI.", unit="g/day", placeholder_type=PlaceholderType.INTERPRETED, output_type=OutputType.NUMERIC, ) cap = build_ai_placeholder_caption(m) assert "Kernbedeutung" in cap assert "Kurzbeschreibung" not in cap def test_build_ai_caption_protein_avg_no_description_prefix(): m = PlaceholderMetadata( key="protein_avg", category="Ernährung", description="Durchschn. Protein in g (30d)", resolver_module="m", resolver_function="f", business_meaning="Zentraler Placeholder für Muskelerhalt.", unit="g/day", placeholder_type=PlaceholderType.INTERPRETED, output_type=OutputType.NUMERIC, ) cap = build_ai_placeholder_caption(m) assert cap.startswith("Zentraler Placeholder") assert "Durchschn. Protein" not in cap assert "Technischer Bezug" not in cap def test_build_ai_caption_score_adds_scale(): m = PlaceholderMetadata( key="test_score", category="Test", description="Score", resolver_module="m", resolver_function="f", business_meaning="Gewichteter Gesamtscore.", unit="Score (0-100)", placeholder_type=PlaceholderType.SCORE, output_type=OutputType.NUMERIC, ) cap = build_ai_placeholder_caption(m) assert "0–100" in cap or "0-100" in cap assert "Gewichteter" in cap def test_placeholder_token_regex_optional_modifier(): m0 = pr._PLACEHOLDER_TOKEN_RE.search("{{fat_avg}}") assert m0 and m0.group(1) == "fat_avg" and m0.group(2) is None m1 = pr._PLACEHOLDER_TOKEN_RE.search("{{fat_avg|d}}") assert m1 and m1.group(1) == "fat_avg" and m1.group(2).strip() == "d" m2 = pr._PLACEHOLDER_TOKEN_RE.search("{{ protein_avg | d }}") assert m2 and m2.group(1) == "protein_avg" and m2.group(2).strip() == "d" m3 = pr._PLACEHOLDER_TOKEN_RE.search("{{k|d,x}}") assert m3 and m3.group(1) == "k" and m3.group(2).strip() == "d,x" def test_get_unknown_placeholders_strips_modifier(): unk = pr.get_unknown_placeholders("{{not_a_real_key|d}}") assert set(unk) == {"not_a_real_key"} def test_format_value_with_d_modifier_uses_description_only(): row = { "key": "protein_avg", "description": "Durchschn. Protein in g (30d)", "ai_caption": "Nur für |x", } out = format_value_with_d_modifier("119g/Tag", row) assert out == "119g/Tag — Durchschn. Protein in g (30d)" assert "Nur für |x" not in out def test_format_value_with_d_modifier_falls_back_to_description(): row = {"description": "Nur Beschreibung", "key": "x"} assert format_value_with_d_modifier("42", row) == "42 — Nur Beschreibung" def test_prompt_executor_modifiers_d_x_combined(): catalog = {"E": [{"key": "p", "description": "Desc", "ai_caption": "Expl"}]} v = {"p": "99"} assert resolve_placeholders("{{p|d}}", v, None, catalog) == "99 — Desc" assert resolve_placeholders("{{p|x}}", v, None, catalog) == "Expl" assert resolve_placeholders("{{p|d,x}}", v, None, catalog) == "99 — Desc — Expl" assert resolve_placeholders("{{p}}", v, None, catalog) == "99"