From fa6a5491cac88e1529454572c900bfa19b8c9fbe Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sun, 23 Aug 2026 15:46:27 +0200 Subject: =?UTF-8?q?Ein=20=C3=84nderungsgesetz=20schreibt=20zwei=20Stammges?= =?UTF-8?q?etze=20fort?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Schleswig-Holstein ändert mit einem Gesetz die Gemeindeordnung und die Kreisordnung zugleich, jede in ihrem eigenen Artikel. Beide Stammfassungen sind nun über die Browsersteuerung beschafft — Vor- wie Nachfassung —, und beide werden vollständig fortgeschrieben: je ein Neufassungsbefehl, kein Rest, und danach gleicht die Gemeindeordnung in allen 167, die Kreisordnung in allen 86 Normen der amtlichen Fassung vom 31. März 2026. Der dritte Artikel ändert ein anderes Änderungsgesetz und bleibt zu Recht unbeachtet. Der Portalsatz hat zwei Eigenheiten. Er trennt die Sachnummer ab („§ 57 c“ statt „§ 57c“); zusammengezogen gehört das zur Aufbereitung, ohne den Handgriff wären zehn Paragraphen der Gemeindeordnung dem Gesetz entgangen. Und er setzt im Klammerzusatz „(Gemeindeordnung - GO -)“ einen Bindestrich, wo das Gesetzblatt einen Gedankenstrich führt. Daran scheiterte die Trennung von Kurztitel und Abkürzung, der Einleitungssatz fand sein Ziel nicht, und es wurde kein Artikel gewählt. Der Parser nimmt den Strich fortan in beiden Gestalten an, sofern Leerraum ihn umgibt — innerhalb eines Namens steht ein Bindestrich stets ohne. Geprüft durch „mvnw verify“: 327 Tests, keine bestehende gepinnte Zahl bewegt, REUSE-Konformität 162 von 162. Co-Authored-By: Claude Opus 5 Change-Id: I11e8e84436c9b4b0e1729f5e4be012cc35335a0c --- src/test/java/eu/mulk/aendggner/EndToEndTest.java | 67 +++++++++++++++++++---- 1 file changed, 57 insertions(+), 10 deletions(-) (limited to 'src/test/java') diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java index a76f478..df80a04 100644 --- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java +++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java @@ -492,12 +492,16 @@ class EndToEndTest { } /** - * Schleswig-Holstein: Extraktion und Befehlserkennung auf dem Kommunalrecht-Änderungsgesetz - * (GVOBl. Schl.-H. 2026/27). Kein voller Akzeptanztest — die konsolidierte Gemeindeordnung ist - * aus freien Quellen nicht in der maßgeblichen Fassung zu beschaffen (das juris-Landesportal - * liefert nur eine anmeldepflichtige API; die letzten frei archivierten Volltexte stammen aus - * 2022 und kennen den hier geänderten § 34a noch nicht). Geprüft wird deshalb alles bis - * einschließlich der Befehlserkennung, gegen ein Stammgesetz ohne Normen. + * Schleswig-Holstein: das Kommunalrecht-Änderungsgesetz (GVOBl. Schl.-H. 2026/27). Voller + * Akzeptanzfall für beide geänderten Gesetze: Artikel 1 fasst § 34a Abs. 1 der Gemeindeordnung + * neu, Artikel 2 den gleichlautenden § 29a Abs. 1 der Kreisordnung; Artikel 3 ändert ein anderes + * Änderungsgesetz und wird zu Recht nicht gewählt. + * + *

Beide Stammfassungen sind über eine Browsersteuerung aus dem Landesrechtsportal beschafft, + * das Skriptabfragen nur seine Anwendungshülle ausgibt; Herkunft und Aufbereitung stehen in + * {@code SchleswigHolstein/SOURCES}. Der Fall trägt zwei Eigenheiten des Portalsatzes: die + * abgetrennte Sachnummer („§ 57 c“) und den Bindestrich statt des Gedankenstrichs im + * Klammerzusatz „(Gemeindeordnung - GO -)“. */ @Test void kommunalrechtAendGSchleswigHolstein() throws Exception { @@ -519,10 +523,24 @@ class EndToEndTest { // Artikel 1 ändert die Gemeindeordnung, Artikel 2 die Kreisordnung, Artikel 3 ein anderes // Änderungsgesetz — nur der jeweils zutreffende Artikel wird gewählt. - var gemeindeordnung = - new Gesetz("GO", "Gemeindeordnung für Schleswig-Holstein", "Gemeindeordnung", List.of()); - var kreisordnung = - new Gesetz("KrO", "Kreisordnung für Schleswig-Holstein", "Kreisordnung", List.of()); + var altGo = SAMPLEDATA.resolve("SchleswigHolstein/GO-SH-alt.txt"); + var altKro = SAMPLEDATA.resolve("SchleswigHolstein/KrO-SH-alt.txt"); + assumeTrue(Files.exists(altGo) && Files.exists(altKro), "Stammfassungen Schl.-H. fehlen"); + var lader = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader(); + var gemeindeordnung = lader.load(altGo); + var kreisordnung = lader.load(altKro); + + // Kurztitel und Abkürzung sind auch dann getrennt, wenn der Klammerzusatz statt des + // Gedankenstrichs einen Bindestrich führt, wie ihn das Portal setzt. + assertThat(gemeindeordnung.jurabk()).isEqualTo("GO"); + assertThat(gemeindeordnung.kurzue()).isEqualTo("Gemeindeordnung"); + // 167 Normen: Die abgetrennte Sachnummer des Portalsatzes („§ 57 c“) ist bei der Aufbereitung + // zusammengezogen — sonst fehlten zehn Paragraphen. Ein Satz, der mit einem Querverweis + // beginnt („§ 102 mit Ausnahme des Absatzes 2 …“), eröffnet dagegen keine Norm. + assertThat(gemeindeordnung.normen()).hasSize(167); + assertThat(gemeindeordnung.norm("§ 57c")).isPresent(); + assertThat(gemeindeordnung.norm("§ 135a")).isPresent(); + assertThat(kreisordnung.normen()).hasSize(86); var go = new AenderungsgesetzParser().parse(text, gemeindeordnung, null); assertThat(go.artikel()).containsExactly("1"); @@ -540,6 +558,35 @@ class EndToEndTest { assertThat(kro.artikel()).containsExactly("2"); assertThat(kro.befehle()).hasSize(1); assertThat(kro.befehle().get(0).stelle().anzeigeText()).isEqualTo("§ 29a Absatz 1"); + + // --- Anwendung, je gegen die amtliche Nachfassung vom 31. März 2026 -------------------- + pruefeGegenNachfassung(gemeindeordnung, go, "SchleswigHolstein/GO-SH-neu.txt"); + pruefeGegenNachfassung(kreisordnung, kro, "SchleswigHolstein/KrO-SH-neu.txt"); + } + + /** + * Wendet die erkannten Befehle an und hält das Ergebnis Norm für Norm gegen die amtliche + * Nachfassung. Kein Befehl darf zur Prüfung von Hand bleiben, keine Norm abweichen. + */ + private static void pruefeGegenNachfassung( + Gesetz alt, AenderungsgesetzParser.ParseErgebnis erkannt, String nachfassung) + throws Exception { + var anwendung = BefehlAnwender.anwenden(alt, erkannt.befehle()); + assertThat(anwendung.anzahlAngewandt()).isEqualTo(erkannt.befehle().size()); + assertThat(anwendung.protokoll()) + .noneMatch(x -> x.status() == BefehlAnwender.Status.MANUELL_PRUEFEN); + + var pfad = SAMPLEDATA.resolve(nachfassung); + assumeTrue(Files.exists(pfad), "Nachfassung " + nachfassung + " fehlt"); + var soll = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(pfad); + assertThat(soll.normen()).hasSameSizeAs(alt.normen()); + for (var normSoll : soll.normen()) { + var normIst = anwendung.neu().norm(normSoll.enbez()); + assertThat(normIst).as("Norm %s fehlt", normSoll.enbez()).isPresent(); + assertThat(normIst.orElseThrow().gesamtText().replaceAll("\\s+", " ").strip()) + .as("Norm %s", normSoll.enbez()) + .isEqualTo(normSoll.gesamtText().replaceAll("\\s+", " ").strip()); + } } /** -- cgit v1.2.1