"""Titel-Hygiene: klammer-bewusster Split + Dash-Normalisierung (M1.1). Reale aak-Schadensfälle: ein en-Dash mit einseitigem Space INNERHALB eines Titels wurde zum Separator → Split mitten im Titel („Aε-Algorithmus (Güte 1+ε, Laufzeit O(n3"). """ from textkit import _norm_dash, _title, _split_top, _unclosed, _parse_selection def test_norm_dash_top_level_only(): # einseitiger Space am Dash → Separator (Modelle liefern das so) assert _norm_dash("Titel –Beschreibung") == "Titel — Beschreibung" assert _norm_dash("Titel— Beschreibung") == "Titel — Beschreibung" # Dash INNERHALB offener Klammer bleibt unangetastet (kein Separator) assert _norm_dash("f (a – b) — Rest") == "f (a – b) — Rest" # ASCII-Hyphen und geklebte/rangebasierte Dashes sind nie Separatoren assert _norm_dash("3-SAT") == "3-SAT" assert _norm_dash("12–15") == "12–15" def test_split_top_bracket_aware(): assert _split_top("a (b — c) — d", " — ") == "a (b — c)" assert _split_top("a — b", " — ") == "a" assert _split_top("kein Separator hier", " — ") == "kein Separator hier" def test_unclosed_bracket_detection(): assert _unclosed("a (b") is True assert _unclosed("a [b {c") is True assert _unclosed("a (b) c") is False assert _unclosed("a) b") is False # überzähliger Schließer ist kein Abschnitt def test_title_keeps_bracketed_dash(): """Der Separator innerhalb der Klammer zerschneidet den Titel nicht mehr.""" t = _title("Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³)) — der Approx-Algorithmus") assert t == "Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³))" def test_title_plain_split_unchanged(): assert _title("Vertex Cover — minimale Knotenüberdeckung") == "Vertex Cover" assert _title("Ohne Separator bleibt ganz") == "Ohne Separator bleibt ganz" def test_title_unclosed_bracket_keeps_entry(): """Malformed: offene Klammer nie geschlossen → keinen abgeschnittenen Titel ausgeben, stattdessen den ganzen Eintrag behalten (Repair = Split rückgängig).""" e = "N P via Turingmaschine (Definition 6.19 — Rest" assert _title(e) == e def test_parse_selection_then_title_regression(): """End-to-end der Parse-Kette (wie in der Pipeline): _norm_dash + _title lassen den Klammer-Inhalt intakt statt mitten im Titel zu splitten (der reale aak-Bug).""" line = "1. Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³)) — der Approximations-Algorithmus" entries = _parse_selection(line) assert _title(entries[1]) == "Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³))"