166 lines
6.4 KiB
Python
166 lines
6.4 KiB
Python
import pruefung
|
|
import struktur
|
|
|
|
|
|
def _pruefe(bereich, feld, text):
|
|
return struktur.befunde(bereich, {feld: text})
|
|
|
|
|
|
def _probleme(befunde):
|
|
return [b["problem"] for b in befunde]
|
|
|
|
|
|
def test_satzzeichen_am_zeilenende():
|
|
b = _pruefe("funktion", "regeln", "- Passwort nie loggen.")[0]
|
|
assert b["problem"] == "Satzzeichen am Zeilenende"
|
|
assert b["vorschlag"] == "Passwort nie loggen"
|
|
|
|
|
|
def test_punkt_im_wort_ist_kein_satzende():
|
|
# Der Prüfer meldete hier „Punkt am Zeilenende" — die Zeile endet auf „v"
|
|
assert _pruefe("funktion", "regeln", "- API Zugänge stehen in .env") == []
|
|
assert _pruefe("funktion", "regeln", "- Nur kern und optional erlaubt") == []
|
|
|
|
|
|
def test_fuellwort_wird_entfernt():
|
|
b = _pruefe("funktion", "regeln", "- Auch Features entfernen")[0]
|
|
assert b["problem"] == "Füllwort „auch“"
|
|
assert b["vorschlag"] == "Features entfernen"
|
|
|
|
|
|
def test_liste_der_fuellwoerter_ist_abschliessend():
|
|
# Das Modell hielt „Im", „Nur" und „direkt" für Füllwörter — sind sie nicht
|
|
for zeile in ("- Im Modal Namen eingeben", "- Nur wenige Wörter",
|
|
"- Feature direkt in Vollmodus geöffnet"):
|
|
assert _pruefe("funktion", "regeln", zeile) == []
|
|
|
|
|
|
def test_wortgrenze_je_bereich_und_feld():
|
|
assert _probleme(_pruefe("feature", "titel", "Karten der Features prüfen")) \
|
|
== ["Mehr als 3 Wörter"]
|
|
assert _pruefe("funktion", "titel", "Karten der Features prüfen") == []
|
|
assert _probleme(_pruefe("funktion", "testen", "- Eins zwei drei vier fünf sechs sieben acht neun")) \
|
|
== ["Mehr als 8 Wörter"]
|
|
|
|
|
|
def test_ohne_vorschlag_wenn_der_code_nicht_kuerzen_kann():
|
|
b = _pruefe("funktion", "testen", "- Eins zwei drei vier fünf sechs sieben acht neun")[0]
|
|
assert b["vorschlag"] == "" # den Ersatz schreibt das Modell
|
|
|
|
|
|
def test_klammer_und_schraegstrich():
|
|
assert _probleme(_pruefe("funktion", "regeln", "- Rand blau (kern)")) \
|
|
== ["Klammer oder Schrägstrich"]
|
|
assert _probleme(_pruefe("funktion", "regeln", "- Kern/Optional getrennt")) \
|
|
== ["Klammer oder Schrägstrich"]
|
|
|
|
|
|
def test_ziel_saetze_und_laenge():
|
|
lang = "Dieses Ziel hat deutlich mehr als zwölf Wörter in einem einzigen langen Satz"
|
|
assert "Satz mit mehr als 12 Wörtern" in _probleme(_pruefe("feature", "ziel", lang))
|
|
assert _probleme(_pruefe("feature", "ziel", "Eins. Zwei. Drei")) == ["Mehr als 2 Sätze"]
|
|
|
|
|
|
def test_badge_nur_kern_oder_optional():
|
|
assert _pruefe("feature", "badge", "optional") == []
|
|
b = _pruefe("feature", "badge", "wichtig")[0]
|
|
assert b["vorschlag"] == "kern"
|
|
|
|
|
|
def test_jede_zeile_einzeln():
|
|
befunde = _pruefe("funktion", "regeln", "- Erste Regel.\n- Auch zweite Regel")
|
|
assert _probleme(befunde) == ["Satzzeichen am Zeilenende", "Füllwort „auch“"]
|
|
|
|
|
|
def test_ein_befund_je_zeile():
|
|
# Zwei Vorschläge für dieselbe Zeile wären nicht unabhängig anwendbar
|
|
befunde = _pruefe("funktion", "regeln", "- Auch Passwort prüfen.")
|
|
assert len(befunde) == 1
|
|
assert befunde[0]["problem"] == "Satzzeichen am Zeilenende, Füllwort „auch“"
|
|
assert befunde[0]["vorschlag"] == "Passwort prüfen"
|
|
|
|
|
|
def test_unreparierbares_zieht_den_ganzen_befund_zum_modell():
|
|
# Zu lang und Füllwort: der Code streicht nicht halb, das Modell schreibt neu
|
|
b = _pruefe("funktion", "testen", "- Auch eins zwei drei vier fünf sechs sieben acht")[0]
|
|
assert b["problem"] == "Füllwort „auch“, Mehr als 8 Wörter"
|
|
assert b["vorschlag"] == ""
|
|
|
|
|
|
def test_auftrag_nennt_feld_und_stelle():
|
|
b = _pruefe("feature", "titel", "Karten der Features prüfen")[0]
|
|
assert struktur.auftrag(b) == '- titel „Karten der Features prüfen“: Mehr als 3 Wörter'
|
|
|
|
|
|
async def test_messung_ist_auftrag_und_tuersteher(datenordner, monkeypatch):
|
|
"""Die Messung geht als Auftrag rein und prüft die Antwort wieder nach.
|
|
Ein Vorschlag, der weiter verstößt, wird zurückgewiesen — mit Begründung."""
|
|
import agents
|
|
import features
|
|
import projekte
|
|
|
|
projekte.anlegen("Test")
|
|
f = features.anlegen(
|
|
"Test",
|
|
"<!-- titel -->\nLogin\n<!-- funktion -->\nAnmelden\n"
|
|
"<!-- regeln -->\n- Auch Passwort prüfen.\n",
|
|
)
|
|
gesehen = []
|
|
# Jede Stimme liefert erst einen halbherzigen Vorschlag: Punkt weg, Füllwort bleibt
|
|
halb = '{"felder": {"regeln": {"neu": "- Auch Passwort prüfen", "grund": "Füllwort"}}}'
|
|
ganz = '{"felder": {"regeln": {"neu": "- Passwort prüfen", "grund": "Füllwort"}}}'
|
|
|
|
async def modell(system, inhalt, temperatur=0.0):
|
|
gesehen.append(inhalt)
|
|
return ganz if "Dein Vorschlag verstößt" in inhalt else halb
|
|
|
|
monkeypatch.setattr(agents, "frage", modell)
|
|
aufgabe = pruefung.aufgaben(f)[1]
|
|
probleme = await pruefung._pruefe({"funktion": "<KATALOG>"}, aufgabe)
|
|
|
|
# Eine Anfrage je Stimme, dazu je eine Nachbesserung
|
|
assert len(gesehen) == 2 * len(pruefung.TEMPERATUREN)
|
|
assert "Gemessen" in gesehen[0]
|
|
assert "Füllwort „auch“" in gesehen[0]
|
|
assert sum("Dein Vorschlag verstößt" in g for g in gesehen) == len(pruefung.TEMPERATUREN)
|
|
|
|
assert [p["original"] for p in probleme] == ["Auch Passwort prüfen."]
|
|
assert probleme[0]["vorschlag"] == "Passwort prüfen"
|
|
assert probleme[0]["feld"] == "regeln"
|
|
assert probleme[0]["funktion"] == "Anmelden"
|
|
|
|
|
|
async def test_unverbesserlicher_vorschlag_faellt_weg(datenordner, monkeypatch):
|
|
import agents
|
|
import features
|
|
import projekte
|
|
|
|
projekte.anlegen("Test")
|
|
f = features.anlegen(
|
|
"Test",
|
|
"<!-- titel -->\nLogin\n<!-- funktion -->\nAnmelden\n"
|
|
"<!-- regeln -->\n- Auch Passwort prüfen.\n",
|
|
)
|
|
|
|
async def sturr(system, inhalt, temperatur=0.0):
|
|
return '{"felder": {"regeln": {"neu": "- Auch anders.", "grund": "x"}}}'
|
|
|
|
monkeypatch.setattr(agents, "frage", sturr)
|
|
probleme = await pruefung._pruefe({"funktion": "<KATALOG>"}, pruefung.aufgaben(f)[1])
|
|
assert probleme == [] # lieber nichts als ein Vorschlag, der wieder auffällt
|
|
|
|
|
|
def test_gemessene_befunde_haengen_am_ausschnitt(datenordner):
|
|
import features
|
|
import projekte
|
|
|
|
projekte.anlegen("Test")
|
|
f = features.anlegen("Test", "<!-- titel -->\nEin viel zu langer Kartentitel\n")
|
|
karte = pruefung.aufgaben(f)[0]
|
|
befunde = struktur.befunde("feature", karte["felder"])
|
|
|
|
assert "Gemessen" not in pruefung.inhalt(karte)
|
|
text = pruefung.inhalt(karte, befunde)
|
|
assert "Gemessen, bitte neu schreiben:" in text
|
|
assert "Mehr als 3 Wörter" in text
|