58 lines
2.6 KiB
Python
58 lines
2.6 KiB
Python
"""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³))"
|