61 lines
2.7 KiB
Python
61 lines
2.7 KiB
Python
import inhalt
|
|
import quellcode
|
|
|
|
|
|
def test_unformatierte_prompts_ohne_doppelklammern():
|
|
"""Was nicht durch .format() geht, darf keine Escape-Klammern tragen —
|
|
das Modell schrieb sie sonst wörtlich in die Antwort und das JSON war kaputt."""
|
|
for name in ("ABDECKUNG_SYSTEM",):
|
|
text = getattr(inhalt, name)
|
|
assert "{{" not in text and "}}" not in text, name
|
|
|
|
|
|
def test_formatierte_prompts_ueberstehen_format():
|
|
punkt = {"art": "Bedienung", "datei": "a.vue", "zeile": 1,
|
|
"umfeld": "x", "rumpf": ""}
|
|
fertig = inhalt.ABDECKUNG.format(funktionen="—", **punkt)
|
|
assert '{"abgedeckt": true' in fertig
|
|
assert "{{" not in fertig
|
|
|
|
|
|
def test_beleg_muss_woertlich_dastehen():
|
|
quelle = {"a.py": "def eins():\n return 1\n"}
|
|
assert quellcode.belegt(quelle, "a.py", "def eins():")
|
|
assert quellcode.belegt(quelle, "a.py", " def eins(): ") # Einrückung egal
|
|
assert quellcode.belegt(quelle, "a.py", "def eins():\nreturn 1")
|
|
assert not quellcode.belegt(quelle, "a.py", "def zwei():")
|
|
assert not quellcode.belegt(quelle, "b.py", "def eins():")
|
|
assert not quellcode.belegt(quelle, "a.py", "")
|
|
|
|
|
|
def test_interaktionen_sind_deterministisch():
|
|
quelle = {
|
|
"frontend/src/X.vue": (
|
|
'<button @click="starte(\'ziel\')">a</button>\n'
|
|
'<button @click="starte(\'regeln\')">b</button>\n'
|
|
'<div @contextmenu="menue">c</div>\n'
|
|
'<input @blur="fertig" @keydown.esc="abbrechen">\n'
|
|
'<span @click="offen = false">zu</span>\n'
|
|
),
|
|
"backend/routes.py": '@router.get("/projekte")\n@router.post("/projekte")\n',
|
|
"frontend/src/m.js": " { text: '+ Projekt erstellen', aktion: () => x() },\n",
|
|
}
|
|
schluessel = [p["schluessel"] for p in quellcode.interaktionen(quelle)]
|
|
# Zwölf Aufrufe von starte() sind eine Fähigkeit, nicht zwölf
|
|
assert schluessel.count("bedienen:starte") == 1
|
|
assert "bedienen:menue" in schluessel
|
|
# Routen: der einzige Weg an Parser, Dateiverwaltung und Prüflogik
|
|
assert "route:get /projekte" in schluessel
|
|
assert "route:post /projekte" in schluessel
|
|
assert "menue:+ Projekt erstellen" in schluessel
|
|
# Technische Aufhänger und Zuweisungen sind keine Fähigkeiten
|
|
assert not any(s.startswith("bedienen:fertig") for s in schluessel)
|
|
assert not any(s.startswith("bedienen:abbrechen") for s in schluessel)
|
|
assert not any(s.startswith("bedienen:offen") for s in schluessel)
|
|
# Zweiter Aufruf liefert exakt dasselbe
|
|
assert schluessel == [p["schluessel"] for p in quellcode.interaktionen(quelle)]
|
|
|
|
|
|
def test_tests_sind_kein_quelltext():
|
|
assert not any("tests/" in p for p in quellcode.dateien())
|