"""Unit-Tests für gewichtetes Fähigkeiten-Scoring (Phase 3).""" from skill_scoring import ( ExerciseOccurrence, compute_skill_profile, match_score_for_skill_ids, _skill_link_multiplier, ) def test_skill_link_multiplier_primary_and_intensity(): assert _skill_link_multiplier(is_primary=True, intensity="hoch") == 1.5 * 1.2 assert _skill_link_multiplier(is_primary=False, intensity="niedrig") == 0.85 def test_compute_skill_profile_aggregates_weights(): occurrences = [ ExerciseOccurrence(exercise_id=1, planned_duration_min=60), ExerciseOccurrence(exercise_id=1, planned_duration_min=30), ] skills_map = { 1: [ { "skill_id": 10, "skill_name": "Distanz", "category": "kihon", "is_primary": True, "intensity": "hoch", "exercise_title": "Übung A", }, { "skill_id": 11, "skill_name": "Balance", "category": "kihon", "is_primary": False, "intensity": "mittel", "exercise_title": "Übung A", }, ], } profile = compute_skill_profile(occurrences, skills_map) assert profile["exercise_occurrence_count"] == 2 assert profile["distinct_exercise_count"] == 1 assert len(profile["skills"]) == 2 assert profile["skills"][0]["skill_id"] == 10 assert profile["total_weight"] > profile["skills"][1]["weight"] assert abs(sum(s["share_percent"] for s in profile["skills"]) - 100.0) < 0.1 def test_match_score_for_skill_ids(): profile = { "total_weight": 100.0, "skills": [ {"skill_id": 1, "skill_name": "A", "weight": 40.0}, {"skill_id": 2, "skill_name": "B", "weight": 60.0}, ], } m = match_score_for_skill_ids(profile, [1]) assert m["match_weight"] == 40.0 assert m["match_percent"] == 40.0 assert m["matched_skill_ids"] == [1]