aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java33
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/DokumentErkennerTest.java46
-rw-r--r--src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextAusgeberTest.java43
3 files changed, 122 insertions, 0 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index 8cd867e..109bbf6 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -1667,6 +1667,39 @@ class EndToEndTest {
assertThat(ergebnis.html()).contains("keine Änderungsbefehle");
}
+ /**
+ * Die Kette und ihr Gedächtnis. Die eigene Ausgabe ist wieder Eingabe; sie trägt im Kopf, welche
+ * Hefte auf ihr schon vollzogen sind. Trifft dasselbe Heft ein zweites Mal auf sie, so greifen
+ * seine Befehle abermals — ein Befehl ist eine Anordnung und keine Zustandsbeschreibung —, und
+ * der angefügte Absatz stünde zweimal da. Am Wortlaut allein ist das nicht zu erkennen, wohl aber
+ * an dem, was die Fassung über sich selbst mitführt.
+ */
+ @Test
+ void ketteRuegtDasZweimalAngewandteHeft() throws Exception {
+ var xml = SAMPLEDATA.resolve("UWG/BJNR141400004.xml");
+ var pdf = SAMPLEDATA.resolve("UWG/bgbl126s0043_regelungstext.pdf");
+ assumeTrue(Files.exists(xml) && Files.exists(pdf), "UWG-Beispieldaten fehlen");
+
+ var erste = Pipeline.erzeugeSynopse(Pipeline.Auftrag.von(xml, List.of(pdf)));
+ assertThat(erste.anzahlAngewandt()).isEqualTo(19);
+ // Das Heft nennt sich nach dem, was im Dokument steht (Ausfertigungsdatum), nicht nach seinem
+ // Dateinamen — sonst hinge die Wiedererkennung an einer Zufälligkeit des Ablageortes.
+ assertThat(erste.neufassung())
+ .containsOnlyOnce("Fortgeschrieben durch: Änderungsgesetz vom 12. Februar 2026");
+
+ var zwischenfassung =
+ new Quelle("UWG-Zwischenfassung.txt", erste.neufassung().getBytes(StandardCharsets.UTF_8));
+ var zweite =
+ Pipeline.erzeugeSynopse(Pipeline.Auftrag.von(zwischenfassung, List.of(Quelle.lies(pdf))));
+
+ assertThat(zweite.html())
+ .contains("Die Fassung trägt „Änderungsgesetz vom 12. Februar 2026“ bereits")
+ .contains("ein zweites Mal angewandt");
+ // Vermerkt bleibt das Heft einmal: Die Liste zählt Hefte, nicht Anwendungen.
+ assertThat(zweite.neufassung())
+ .containsOnlyOnce("Fortgeschrieben durch: Änderungsgesetz vom 12. Februar 2026");
+ }
+
private static Aenderungsbefehl befehlZu(
AenderungsgesetzParser.ParseErgebnis ergebnis, String gliederungsPfad) {
return ergebnis.befehle().stream()
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/DokumentErkennerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/DokumentErkennerTest.java
index aad40d5..4d756a7 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/DokumentErkennerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/DokumentErkennerTest.java
@@ -8,6 +8,7 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue;
import eu.mulk.aendggner.aenderung.DokumentArt;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.time.LocalDate;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
@@ -45,6 +46,51 @@ class DokumentErkennerTest {
assertThat(kopf.art()).isEqualTo(erwartet);
}
+ /**
+ * Das Ausfertigungsdatum aus der Zeile „Vom …“. An ihm erkennt die Fassung ein Heft wieder, das
+ * auf sie schon angewandt worden ist; deshalb darf es nicht geraten sein. Ein Sammelheft stellt
+ * mehrere Verkündungen nebeneinander (so das thüringische GVBl. Nr. 2/2026 mit vieren), und
+ * welche von ihnen das Dokument ausmacht, sagt sein Kopf nicht — dann bleibt das Datum leer.
+ */
+ @ParameterizedTest
+ @CsvSource({
+ "UWG/bgbl126s0043_regelungstext.pdf, 2026-02-12",
+ "Brandenburg/GVBl-I-2026-12_FraktG-AendG.pdf, 2026-04-22",
+ "NRW/GV-NRW-2026-S202_22-Rundfunkaenderungsgesetz.pdf, 2026-03-24",
+ "Hessen/GVBl-2026-05_11-AendVO-verkehrsrechtl-Zustaendigkeiten.pdf, 2026-01-28",
+ "Thueringen/GVBl-TH-2026-02_KiGaFinanzVO-AendVO-ua.pdf, ",
+ "GEG/BT-Drs-20-6875_Regierungsentwurf.pdf, ",
+ })
+ void liestDasAusfertigungsdatum(String datei, String erwartet) throws Exception {
+ var pfad = SAMPLEDATA.resolve(datei.strip());
+ assumeTrue(Files.exists(pfad), "Beispieldatei fehlt: " + datei);
+
+ var kopf = DokumentErkenner.erkenne(new PatchTextExtraktor().extrahiere(pfad));
+
+ assertThat(kopf.ausfertigung())
+ .isEqualTo(erwartet == null ? null : LocalDate.parse(erwartet.strip()));
+ }
+
+ /**
+ * Woran ein Heft sich nennt: an seiner Drucksachennummer, sonst an seinem Ausfertigungsdatum. Der
+ * Dateiname bleibt außen vor — er ist eine Zufälligkeit des Ablageortes, und an der Bezeichnung
+ * hängt die Wiedererkennung in der Kette.
+ */
+ @Test
+ void bezeichnetSichNachDemDokumentUndNichtNachDerDatei() throws Exception {
+ var gesetzblatt = SAMPLEDATA.resolve("UWG/bgbl126s0043_regelungstext.pdf");
+ var drucksache = SAMPLEDATA.resolve("UWG/BT-Drs-21-1855_Regierungsentwurf.pdf");
+ assumeTrue(Files.exists(gesetzblatt) && Files.exists(drucksache), "UWG-Beispieldaten fehlen");
+
+ assertThat(
+ DokumentErkenner.erkenne(new PatchTextExtraktor().extrahiere(gesetzblatt))
+ .anzeigeName())
+ .isEqualTo("Änderungsgesetz vom 12. Februar 2026");
+ assertThat(
+ DokumentErkenner.erkenne(new PatchTextExtraktor().extrahiere(drucksache)).anzeigeName())
+ .isEqualTo("Gesetzentwurf Drs. 21/1855");
+ }
+
/** Die Drucksachennummern stiften die Verbindung zwischen Antrag und Entwurf. */
@Test
void liestEigeneUndBezogeneDrucksachennummern() throws Exception {
diff --git a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextAusgeberTest.java b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextAusgeberTest.java
index e620a03..6d6eab2 100644
--- a/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextAusgeberTest.java
+++ b/src/test/java/eu/mulk/aendggner/gesetz/land/LandesRechtTextAusgeberTest.java
@@ -5,12 +5,16 @@ package eu.mulk.aendggner.gesetz.land;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import eu.mulk.aendggner.gesetz.Fortschreibung;
import eu.mulk.aendggner.gesetz.Gesetz;
+import eu.mulk.aendggner.gesetz.Stand;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.time.LocalDate;
import java.util.List;
import java.util.stream.Stream;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -52,6 +56,8 @@ class LandesRechtTextAusgeberTest {
assertThat(wiederGelesen.kurzue()).isEqualTo(gelesen.kurzue());
assertThat(bezeichnungen(wiederGelesen)).isEqualTo(bezeichnungen(gelesen));
assertThat(wiederGelesen.gliederungen()).isEqualTo(gelesen.gliederungen());
+ assertThat(wiederGelesen.stand()).isEqualTo(gelesen.stand());
+ assertThat(wiederGelesen.fortschreibungen()).isEqualTo(gelesen.fortschreibungen());
for (var soll : gelesen.normen()) {
var ist = wiederGelesen.norm(soll.enbez()).orElseThrow();
@@ -63,6 +69,43 @@ class LandesRechtTextAusgeberTest {
}
}
+ /**
+ * Der Kopf trägt das Gedächtnis der Kette: Standangabe und angewandte Hefte müssen den Rundlauf
+ * überstehen, sonst wüsste die nächste Stufe nicht, was der Wortlaut schon trägt — und dasselbe
+ * Heft ließe sich unbemerkt ein zweites Mal anwenden.
+ */
+ @Test
+ void rundlaufErhaeltStandUndHefte() throws IOException {
+ var datei = SAMPLEDATA.resolve("Brandenburg/FraktG-alt.txt");
+ assumeTrue(Files.exists(datei), "Beispieldaten fehlen");
+ var gelesen =
+ new LandesRechtLoader()
+ .load(datei)
+ .mitFortschreibung(
+ new Fortschreibung("Änderungsgesetz vom 22. April 2026", LocalDate.of(2026, 4, 22)))
+ .mitFortschreibung(new Fortschreibung("Gesetzentwurf Drs. 7/4711", null));
+ var mitStand =
+ new Gesetz(
+ gelesen.jurabk(),
+ gelesen.langue(),
+ gelesen.kurzue(),
+ gelesen.normen(),
+ gelesen.gliederungen(),
+ Stand.aus("Zuletzt geändert durch Art. 2 G v. 15.12.2022 I Nr. 26"),
+ gelesen.fortschreibungen());
+
+ var wiederGelesen = LandesRechtTextParser.parse(LandesRechtTextAusgeber.ausgeben(mitStand));
+
+ assertThat(wiederGelesen.stand()).isEqualTo(mitStand.stand());
+ assertThat(wiederGelesen.stand().juengsteAenderung()).isEqualTo(LocalDate.of(2022, 12, 15));
+ assertThat(wiederGelesen.fortschreibungen()).isEqualTo(mitStand.fortschreibungen());
+ // Der Wortlautstand folgt dem jüngsten Heft, nicht der Standzeile: Wer fortschreibt, macht den
+ // Wortlaut jünger, als die Quelle ihn ausweist.
+ assertThat(wiederGelesen.wortlautStand()).isEqualTo(LocalDate.of(2026, 4, 22));
+ assertThat(wiederGelesen.traegt(new Fortschreibung("Änderungsgesetz vom 22. April 2026", null)))
+ .isTrue();
+ }
+
private static List<String> bezeichnungen(Gesetz gesetz) {
return gesetz.normen().stream().map(n -> n.enbez()).toList();
}