"""Tests Planungs-KI Phase E — Semantik-Schicht.""" from planning_exercise_semantics import ( apply_dynamic_retrieval_weights, build_semantic_brief, score_exercise_semantic_relevance, step_retrieval_query, ) def test_build_semantic_brief_mae_geri(): brief = build_semantic_brief( "Von Erlernen bis zur Perfektion, des Fußtritts Mae Geri" ) assert brief.primary_topic == "mae geri" assert brief.must_phrases == ["mae geri"] assert "mawashi geri" in brief.exclude_phrases assert "perfektion" not in brief.must_phrases assert brief.semantic_strength >= 0.8 def test_semantic_score_prefers_mae_over_mawashi(): brief = build_semantic_brief("Mae Geri Perfektion") mae_score, _ = score_exercise_semantic_relevance( title="Mae Geri — Frontkick Grundstellung", summary="Frontkick von vorn", goal="Sauberer Mae Geri", variant_names=[], brief=brief, ) mawashi_score, _ = score_exercise_semantic_relevance( title="Mawashi Geri — Rundkick", summary="Rundkick Technik", goal="Mawashi Geri Höhe", variant_names=[], brief=brief, ) assert mae_score > mawashi_score def test_dynamic_weights_boost_semantic_for_query_only(): brief = build_semantic_brief("Mae Geri bis Perfektion") base = { "fulltext": 0.45, "semantic": 0.0, "progression": 0.08, "skill": 0.08, "plan": 0.08, "profile": 0.15, "repeat_unit": -0.3, "repeat_group": -0.15, } out = apply_dynamic_retrieval_weights( base, brief, scenario="free_search", has_planning_reference=False, ) assert out["semantic"] > 0.25 assert out["fulltext"] < base["fulltext"] def test_step_retrieval_query_carries_topic_and_phase(): brief = build_semantic_brief("Mae Geri von Einstieg bis Perfektion") q0 = step_retrieval_query(brief, brief.retrieval_query, 0, 5) q4 = step_retrieval_query(brief, brief.retrieval_query, 4, 5) assert "mae geri" in q0.lower() assert "mae geri" in q4.lower() assert "einstieg grundübung" not in q0.lower()