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.java44
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/AenderungsgesetzParserTest.java31
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java13
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:"))