aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/eu
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/eu')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index d7e19f3..2698fa5 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -1047,6 +1047,84 @@ class EndToEndTest {
}
/**
+ * Baden-Württemberg: Die Verordnung des Innenministeriums zur Änderung der Kommunalwahlordnung
+ * (GBl. 2026 Nr. 26). 37 Befehle, 31 angewandt; 91 der 93 Normen gleichen danach der amtlichen
+ * Fassung vom 1. Mai 2026.
+ *
+ * <p>Zwei Eigenheiten des GBl-Satzes waren zu beheben: Der Seitenfuß steht im Inhaltsstrom
+ * <em>mitten im Befehlstext</em> und trennt dort den Zieltext eines Befehls von seinem Verb, und
+ * die Blattzählung („Seite 2 von 7“) steht mitunter für sich zwischen zwei Gliederungspunkten.
+ * Dazu zwei Befehlsidiome: der Dativ ohne Artikel („Absatz 2 wird folgender Satz angefügt“) und
+ * der Klammerzusatz hinter einer Anlagenbezeichnung („In Anlage 3b (Muster des Merkblatts …)“).
+ *
+ * <p>Die sechs liegengebliebenen Befehle betreffen sämtlich die <em>Muster</em> der Anlagen
+ * (Wahlschein, Merkblätter). Sie sind nicht anwendbar, weil das Landesrechtsportal die Muster
+ * nicht als Text ausliefert: Die Anlagen 2 bis 14 bestehen dort nur aus Kopf und Fundstelle. Was
+ * nicht vorliegt, lässt sich nicht ändern — das ist eine Grenze der Quelle, nicht des Werkzeugs.
+ */
+ @Test
+ void kommunalwahlOAendVOBadenWuerttemberg() throws Exception {
+ var alt = SAMPLEDATA.resolve("BadenWuerttemberg/KomWO-BW-alt.txt");
+ var pdf = SAMPLEDATA.resolve("BadenWuerttemberg/GBl-2026-26_KommunalwahlO-AendVO.pdf");
+ assumeTrue(Files.exists(alt) && Files.exists(pdf), "KomWO-BW-Beispieldaten fehlen");
+
+ var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+ assertThat(gesetz.jurabk()).isEqualTo("KomWO");
+ // 92 Normen; der Befehl 15. fügt den § 57a hinzu, den die Nachfassung dann als 93. führt.
+ assertThat(gesetz.normen()).hasSize(92);
+
+ var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf));
+ // Der Seitenfuß ist heraus — samt der Blattzählung, die für sich allein stand.
+ assertThat(text).doesNotContain("Gesetzblatt für Baden-Württemberg, Jahrgang");
+ assertThat(text).doesNotContain("Seite 2 von 7");
+ // Ohne ihn steht der Befehl wieder zusammenhängend da.
+ assertThat(text.replaceAll("\\s+", " "))
+ .contains("die Wörter „Telegramm, Fernschreiben,“ gestrichen");
+
+ var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+ assertThat(parseErgebnis.artikel()).containsExactly("1");
+ assertThat(parseErgebnis.befehle()).hasSize(37);
+
+ var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+ var manuellPfade =
+ anwendung.protokoll().stream()
+ .filter(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN)
+ .map(a -> a.befehl().provenienz().gliederungsPfad())
+ .toList();
+ assertThat(manuellPfade)
+ .containsExactly("16. a)", "16. b)", "16. b) aa)", "16. b) bb)", "17.", "18.");
+ assertThat(anwendung.anzahlAngewandt()).isEqualTo(31);
+
+ // „Absatz 2 Satz 3 Halbsatz 2 wird gestrichen“ — der Halbsatz nimmt sein Semikolon mit, und
+ // der Satz behält seinen Schlusspunkt; so setzt es auch die amtliche Nachfassung.
+ // (Der gleichlautende Halbsatz eines späteren Satzes bleibt unberührt.)
+ assertThat(anwendung.neu().norm("§ 24").orElseThrow().absaetze().get(1).text())
+ .contains("Absatz 1 Satz 3 gilt entsprechend. Im übrigen")
+ .doesNotContain("entsprechend; anstelle der Wohnung ist der Wohnort anzugeben");
+
+ // Norm für Norm gegen die amtliche Fassung vom 1. Mai 2026.
+ var soll =
+ new eu.mulk.aendggner.gesetz.land.LandesRechtLoader()
+ .load(SAMPLEDATA.resolve("BadenWuerttemberg/KomWO-BW-neu.txt"));
+ var abweichend = new java.util.ArrayList<String>();
+ for (var normSoll : soll.normen()) {
+ var normIst = anwendung.neu().norm(normSoll.enbez()).orElseThrow();
+ if (!normIst
+ .gesamtText()
+ .replaceAll("\\s+", " ")
+ .strip()
+ .equals(normSoll.gesamtText().replaceAll("\\s+", " ").strip())) {
+ abweichend.add(normSoll.enbez());
+ }
+ }
+ // § 20: Der Befehl ersetzt das Wort „Name“ durch „der vollständige Familienname“; im Zieltext
+ // steht davor bereits „der“, sodass es doppelt erscheint. Die amtliche Nachfassung räumt das
+ // auf, der Befehlswortlaut tut es nicht — ÄndGgner wendet den Wortlaut an.
+ // Anlage 1: die sechs Muster-Befehle, siehe oben.
+ assertThat(abweichend).containsExactly("§ 20", "Anlage 1");
+ }
+
+ /**
* Nordrhein-Westfalen: Artikel 4 desselben Heftes fasst § 1 des Ausführungsgesetzes zum
* Siebzehnten Rundfunkänderungsstaatsvertrag neu. Damit sind alle vier ändernden Artikel des
* Heftes GV. NRW. 7/2026 belegt.