This commit is contained in:
team3
2026-07-06 14:44:20 +02:00
parent f4c5116abb
commit cc27e53b9e
20 changed files with 504 additions and 267 deletions

View File

@@ -0,0 +1,57 @@
"""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("1215") == "1215"
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³))"