This commit is contained in:
team3
2026-07-12 21:21:41 +02:00
parent cde1721d10
commit a9b2f5ab9e
28 changed files with 106 additions and 706 deletions

View File

@@ -313,7 +313,7 @@ async def test_reparieren_bewegt_false_bei_identischem_text(monkeypatch):
b_id = db.insert("bausteine", topic=topic, ziel_id=ziel, titel="B", ord=0, status="neu")
a = db.insert("atome", topic=topic, titel="A", typ="begriff", definition="d",
status="neu", baustein_id=b_id, braucht=db.j([]))
lang = f"<!-- atom: {a} | A -->\n" + "Wort " * 60
lang = f"<!-- atom: {a} | A -->\n" + ("Wort " * 60).strip() # ohne Trailing-Space
db.insert("sections", baustein_id=b_id, stage="fix", text_lang=lang,
text_kompakt="- p", befunde=db.j(["Behebe (laenge): kürzen"]))
monkeypatch.setitem(fake_agents._HANDLER, "Guide-Fix",
@@ -366,6 +366,20 @@ def test_split_writer_delimited_und_fallback():
assert guide._split_writer("nur text")[1] == "nur text"
def test_writer_saeubern_terminator():
import guide
# geleakter `=====`-Terminator (Setext-H1 unter Bullet) + </s> raus
roh = "- $M$ gilt\n\n$$L \\in NP$$\n- Für jedes $L$ gilt\n=====\n</s>"
sauber = guide._writer_saeubern(roh)
assert "=====" not in sauber and "</s>" not in sauber
assert sauber.endswith("- Für jedes $L$ gilt")
# _split_writer säubert den kompakt-Block (letzter Block fängt sonst das =====)
k, l = guide._split_writer("===LANG===\nText\n===KOMPAKT===\n- a\n- b\n=====\n</s>")
assert k == "- a\n- b" and l == "Text"
# Tabellen-Trenner (---) bleibt unangetastet
assert "---" in guide._writer_saeubern("| A | B |\n|---|---|\n| 1 | 2 |")
async def test_fix_cap_friert_section_ein(monkeypatch):
"""Nach FIX_MAX_VERSUCHE erfolglosen Fixes (Text unverändert) wird die Section
für Stil-Befunde eingefroren → reparieren meldet bewegt=False (Stillstand)."""
@@ -388,3 +402,25 @@ async def test_fix_cap_friert_section_ein(monkeypatch):
bewegt = await guide.reparieren(
ctx, [{"art": "det_check", "item": str(b), "detail": "Kürzen"}])
assert bewegt is False # eingefroren → nicht geroutet → kein Fortschritt
async def test_marker_platzieren_deterministisch():
"""Der Writer setzt keine Beispiel-Marker mehr — _marker_platzieren fügt sie
hinter den Atom-Absatz ein (atom-genau)."""
import db
import guide
from conftest import topic_anlegen
topic = topic_anlegen("platz")
b = db.insert("bausteine", topic=topic, ziel_id=1, titel="B", ord=0, status="neu")
a = db.insert("atome", topic=topic, titel="X", typ="begriff", definition="d",
status="neu", baustein_id=b, ord=0, braucht=db.j([]))
art = db.insert("artefakte", atom_id=a, typ="beispiel", status="verifiziert",
inhalt=db.j({"form": "tabelle", "tabelle": "| A | B |\n|---|---|\n| 1 | 2 |"}))
lang = f"#### X\n<!-- atom: {a} | X -->\nErklärung von X.\n\nWeiterer Absatz zum Thema."
out = guide._marker_platzieren(db.one("SELECT * FROM bausteine WHERE id=?", (b,)), lang)
assert f"<!-- beispiel: {art} -->" in out
# der Marker steht NACH dem Atom-Absatz
assert out.index("<!-- beispiel:") < out.index("Weiterer Absatz")
# idempotent: zweiter Lauf dupliziert nicht
assert guide._marker_platzieren(db.one("SELECT * FROM bausteine WHERE id=?", (b,)),
out).count("<!-- beispiel:") == 1