"""Tests gemeinsames Planungs-Intent-Modul (Progressionsgraph → Trainingsplanung).""" from planning_intent_context import ( build_planning_intent_context, extract_explicit_exclusions, finalize_stage_specs_with_intent, ) from planning_progression_roadmap import ( MajorStep, StageSpecArtifact, build_goal_analysis, build_stage_specs, run_progression_roadmap_pipeline, ) from planning_exercise_semantics import build_semantic_brief, enrich_brief_with_path_constraints def test_extract_explicit_exclusions_parses_negations(): q = "gesprungener Mawashi Geri, keine Kumite-Anwendung gewünscht" out = extract_explicit_exclusions(q) assert any("kumite" in x.lower() for x in out) def test_build_planning_intent_context_includes_path_anti(): q = "Mawashi Geri Sprungkraft, keine Kumite-Anwendung" brief = enrich_brief_with_path_constraints(build_semantic_brief(q), q) ga = build_goal_analysis(q, brief) intent = build_planning_intent_context(q, semantic_brief=brief, goal_analysis=ga.model_dump()) assert intent.explicit_exclusions assert any("kumite" in a for a in intent.path_anti_patterns) def test_finalize_stage_specs_merges_intent_into_each_stage(): q = "gesprungener Mawashi Geri, keine Kumite-Anwendung" brief = enrich_brief_with_path_constraints(build_semantic_brief(q), q) ga = build_goal_analysis(q, brief) intent = build_planning_intent_context(q, semantic_brief=brief, goal_analysis=ga.model_dump()) majors = [ MajorStep(index=0, phase="grundlage", learning_goal="Grundtechnik Mawashi", consolidates=["m1"]), MajorStep(index=1, phase="vertiefung", learning_goal="Sprungkoordination", consolidates=["m2"]), ] raw_specs = [ StageSpecArtifact(major_step_index=0, learning_goal=majors[0].learning_goal), StageSpecArtifact(major_step_index=1, learning_goal=majors[1].learning_goal), ] finalized = finalize_stage_specs_with_intent(raw_specs, majors, intent=intent) assert len(finalized) == 2 for spec in finalized: assert spec.success_criteria assert any("kumite" in a.lower() for a in spec.anti_patterns) assert any("messbar" in c.lower() or "übungsziel" in c.lower() for c in spec.success_criteria) def test_pipeline_stage_specs_carry_exclusions_without_llm(): q = "gesprungener Mawashi Geri Sprungphase, keine Kumite-Anwendung" ctx = run_progression_roadmap_pipeline(q, max_steps=3, include_llm_roadmap=False) assert len(ctx.stage_specs) == 3 for spec in ctx.stage_specs: assert any("kumite" in a.lower() for a in (spec.anti_patterns or []))