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": ( '\n' '\n' '
c
\n' '\n' 'zu\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 assert not any(s.startswith("schnittstelle:") for s in schluessel) # Verdrahtung 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())