diff options
Diffstat (limited to 'src/test')
3 files changed, 88 insertions, 0 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java index e7f7a00..19a7c8c 100644 --- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java +++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java @@ -554,4 +554,48 @@ class EndToEndTest { var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false); assertThat(HtmlRenderer.rendere(synopse, "E2E-Test TMZ-Gesetz")).contains("§ 2"); } + + /** + * Berlin: Das GVBl. ist zweispaltig gesetzt (Wolters-Kluwer-Satz). Der Test hält das Ergebnis des + * Spaltenspikes fest — die Spaltenreihenfolge des Inhaltsstroms ist bereits die Lesereihenfolge, + * eine koordinatenbasierte Spaltenerkennung ist dafür nicht nötig. + * + * <p>Kein voller Akzeptanztest: gesetze.berlin.de ist wie das schleswig-holsteinische Portal eine + * anmeldepflichtige juris-Anwendung, die Stammfassungen sind daraus nicht zu beschaffen. Artikel 1 + * ändert zudem eine *Anlage* mit eigener Nummern-Gliederung — ein Änderungsziel, das ÄndGgner + * nicht modelliert (dieselbe Grenze, an der Baden-Württemberg zurückgestellt wurde). + */ + @Test + void asogLafAendGBerlin() throws Exception { + var pdf = SAMPLEDATA.resolve("Berlin/GVBl-2026-17_ASOG-LAF-AendG.pdf"); + assumeTrue(Files.exists(pdf), "GVBl-Berlin-Beispiel-PDF fehlt"); + + var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf)); + + // Spaltenspike: Die Befehle beider Artikel stehen in Lesereihenfolge im Text — die linke Spalte + // läuft vollständig vor der rechten, ohne Verschränkung. + assertThat(text.indexOf("§ 67 Absatz 2 wird wie folgt gefasst")) + .isLessThan(text.indexOf("Die Anlage zu § 2 Absatz 4 Satz 1 wird wie folgt geändert")); + assertThat(text.indexOf("Die Anlage zu § 2 Absatz 4 Satz 1 wird wie folgt geändert")) + .isLessThan(text.indexOf("In der Nummer 2 wird der Punkt am Ende")); + // Der laufende Seitenkopf ist auch dort entfernt, wo er mitten im Fließtext klebt. + assertThat(text).doesNotContain("Gesetz- und Verordnungsblatt für Berlin"); + + // Artikel 2 trägt sein Ziel in der Änderungsformel („§ 2 Satz 1 des Gesetzes zur Errichtung + // …“); beide Punkte erben es als Kontext. + var laf = + new Gesetz( + "LAF-ErrichtungsG", + "Gesetz zur Errichtung eines Landesamtes für Flüchtlingsangelegenheiten und" + + " Unterbringung", + null, + List.of()); + var ergebnis = new AenderungsgesetzParser().parse(text, laf, null); + assertThat(ergebnis.artikel()).containsExactly("2"); + assertThat(ergebnis.befehle()).hasSize(2); + assertThat(ergebnis.befehle()).noneMatch(b -> b instanceof UnbekannterBefehl); + assertThat(ergebnis.befehle()) + .extracting(b -> b.stelle().anzeigeText()) + .containsExactly("§ 2 Satz 1 Nummer 2", "§ 2 Satz 1 Nummer 2"); + } } diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java index a8ec3aa..2dc53bb 100644 --- a/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java +++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java @@ -17,6 +17,37 @@ class AenderungsgesetzParserTest { "UWG", "Gesetz gegen den unlauteren Wettbewerb", "UWG-Langtitel", List.of(), List.of()); @Test + void nimmtEingebettetesParagraphenZielAlsKontext() { + // Berliner Zuschnitt: Die Änderungsformel trägt ihr Ziel selbst („§ 2 Satz 1 des Gesetzes zur + // Errichtung … wird wie folgt geändert“), die Punkte nennen nur noch die Feinstelle. Der + // §-Zweig des Musters war bislang unerreichbar (\b vor dem Nicht-Wortzeichen „§“). + var laf = + new Gesetz( + "LAF-ErrichtungsG", + "Gesetz zur Errichtung eines Landesamtes für Flüchtlingsangelegenheiten und" + + " Unterbringung", + null, + List.of(), + List.of()); + var text = + """ + Artikel 1 + Änderung des Gesetzes zur Errichtung eines Landesamtes für Flüchtlingsangelegenheiten und Unterbringung + § 2 Satz 1 des Gesetzes zur Errichtung eines Landesamtes für Flüchtlingsangelegenheiten und Unterbringung vom 14. März 2016 (GVBl. S. 93), das zuletzt durch Artikel 2 des Gesetzes vom 1. April 2026 (GVBl. S. 154) geändert worden ist, wird wie folgt geändert: + 1. In der Nummer 2 wird der Punkt am Ende durch ein Semikolon ersetzt. + 2. Nach Nummer 2 wird folgende Nummer 3 eingefügt: + „3. Beratung sowie Hilfen zur freiwilligen Rückkehr.“ + """; + + var ergebnis = new AenderungsgesetzParser().parse(text, laf, null); + + assertThat(ergebnis.artikel()).containsExactly("1"); + assertThat(ergebnis.befehle()) + .extracting(b -> b.stelle().anzeigeText()) + .containsExactly("§ 2 Satz 1 Nummer 2", "§ 2 Satz 1 Nummer 2"); + } + + @Test void teiltParagraphenGegliedertesAenderungsgesetz() { // Bayerischer Stil: das Änderungsgesetz gliedert sich in §§; § 1 und § 2 treffen dasselbe // Stammgesetz, § 3 ein anderes; Inkrafttretens-§ ohne Änderungsformel wird nicht gewählt. diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java index 4da5c79..5ed8b93 100644 --- a/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java +++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java @@ -224,6 +224,19 @@ class TextBereinigerTest { } @Test + void schneidetDenBerlinerSeitenkopfAusDemFliesstext() { + // Im GVBl. für Berlin steht der laufende Seitenkopf nicht auf einer eigenen Zeile, sondern + // klebt samt Seitenzahl mitten im Text der folgenden Spalte. + var roh = + "zur Sicherung des Betriebs\n" + + "235Gesetz- und Verordnungsblatt für Berlin 82. Jahrgang Nr. 17" + + " 11. Juni 2026 von Unterkünften."; + + assertThat(TextBereiniger.bereinige(roh)) + .isEqualTo("zur Sicherung des Betriebs\nvon Unterkünften."); + } + + @Test void ziehtSachnummernMitLeerzeichenZusammen() { // Niedersachsen zitiert eingeschobene Paragraphen als „§ 2 a“; kanonisch ist „§ 2a“. assertThat(TextBereiniger.bereinige("Nach § 2 wird der folgende § 2 a eingefügt:")) |
