aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-07-24 22:29:35 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-07-24 22:29:35 +0200
commit43e91612875de3cc6e7466eee56023ab55cefd89 (patch)
tree867f602cd8b00a320987cde8947778deaa7efa45 /src/test
parent3f81addcfbeae7aabcdd823340397f66e394f02f (diff)
Add Lower Saxony NEFG acceptance case and two parser robustness fixes
Second §-structured Landesrecht case for wave six: the Lower Saxony ELER Support Act (NEFG, unchanged since 2022, derived from the two-column Nds. GVBl 2022 No. 33) plus the amending act of 28 Jan 2026 (Nds. GVBl 2026 No. 10). Five of seven commands apply — both "erhält folgende Fassung" re-enactments (§ 1(1), § 2), the citation replacement in § 1(5), the words insertion in § 6(1), and the § 13 → § 14 renumbering. - LandesRechtTextParser: a norm head no longer accepts a title ending in a full stop, so a cross-reference sentence at line start ("§ 7 GAPInVeKoSG findet entsprechend Anwendung.") is not misread as a norm head "§ 7" (which had made the monotonicity check swallow the norms in between). - TextBereiniger: strip the Lower Saxony GVBl running footer and publisher line. The footer sat between two enumerated items and otherwise attached to the preceding re-enactment quote, defeating its end-of-sentence anchor. - Add sampledata/Niedersachsen/NEFG-alt.txt and EndToEndTest.nefgAcceptance. Two insertion forms remain documented residues (manuell prüfen): inserting a §-block with a space-separated sub-number ("§ 2 a") and a chapter-scoped §-block insertion ("In Kapitel 4 wird nach § 12 … angefügt"). 221 tests green; federal, Bavarian and Saxon pinned numbers unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Change-Id: Ie23eee1f596ec8eecc6a73f6ce585a22e73ec6c9
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index 98a996f..90ad4ed 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -367,4 +367,65 @@ class EndToEndTest {
var html = HtmlRenderer.rendere(synopse, "E2E-Test SächsBeamtVG");
assertThat(html).contains("§ 47");
}
+
+ /**
+ * Niedersächsisches Landesrecht (sechste Welle): das Niedersächsische ELER-Fördergesetz (NEFG,
+ * seit 2022 unverändert, Klartext aus dem zweispaltigen Nds. GVBl 2022 Nr. 33 abgeleitet) + das
+ * Gesetz zur Änderung des NEFG vom 28. Januar 2026 (Nds. GVBl 2026 Nr. 10). Prüft den
+ * §-gegliederten Superskript-Modus und die Neufassungsform „erhält folgende Fassung“ auf einem
+ * zweispaltig gesetzten Ausgangsheft.
+ */
+ @Test
+ void nefgAcceptance() throws Exception {
+ var alt = SAMPLEDATA.resolve("Niedersachsen/NEFG-alt.txt");
+ var pdf = SAMPLEDATA.resolve("Niedersachsen/Nds-GVBl-2026-10_ELER-Foerdergesetz-AendG.pdf");
+ assumeTrue(Files.exists(alt) && Files.exists(pdf), "NEFG-Beispieldaten fehlen");
+
+ var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+ assertThat(gesetz.jurabk()).isEqualTo("NEFG");
+ assertThat(gesetz.langue()).isEqualTo("Niedersächsisches ELER-Fördergesetz");
+ assertThat(gesetz.normen()).hasSize(13);
+ assertThat(gesetz.norm("§ 1").orElseThrow().absaetze()).hasSize(5);
+
+ var text =
+ TextBereiniger.bereinige(
+ new PatchTextExtraktor(eu.mulk.aendggner.aenderung.parse.SuperskriptModus.BEHALTEN)
+ .extrahiere(pdf));
+ // Die laufende GVBl-Fußzeile ist entfernt — sonst hängte sie sich an das Neufassungs-Zitat des
+ // § 1 Abs. 1 und der Befehl würde nicht erkannt.
+ assertThat(text).doesNotContain("Nds. GVBl. 2026 Nr. 10");
+
+ var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+ assertThat(parseErgebnis.artikel()).containsExactly("1");
+ assertThat(parseErgebnis.befehle()).hasSize(7);
+
+ // Fünf der sieben Befehle werden angewandt. Zwei bleiben als „manuell prüfen“ stehen — zwei
+ // Einfügeformen, die ÄndGgner noch nicht beherrscht (bewusst dokumentierte Grenze, nicht
+ // stillschweigend verworfen):
+ // * Nr. 3 „Nach § 2 wird der folgende § 2 a eingefügt“ — Einfügung eines §-Blocks mit einer
+ // durch Leerzeichen getrennten Sachnummer („§ 2 a“).
+ // * Nr. 5 „In Kapitel 4 wird nach § 12 der folgende neue § 13 angefügt“ — kapitelbezogene
+ // §-Block-Einfügung.
+ var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+ assertThat(anwendung.anzahlAngewandt()).isEqualTo(5);
+ var manuellPfade =
+ anwendung.protokoll().stream()
+ .filter(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN)
+ .map(a -> a.befehl().provenienz().gliederungsPfad())
+ .toList();
+ assertThat(manuellPfade).containsExactlyInAnyOrder("3.", "5.");
+
+ // Stichproben: „erhält folgende Fassung“ (§ 1 Abs. 1, § 2), Angaben-Ersetzung (§ 1 Abs. 5),
+ // Wörter-Einfügung (§ 6 Abs. 1) und §-Umnummerierung (§ 13 → § 14).
+ var neu = anwendung.neu();
+ assertThat(neu.norm("§ 1").orElseThrow().absaetze().get(0).text())
+ .contains("Verordnung (EU) 2021/2116");
+ assertThat(neu.norm("§ 1").orElseThrow().absaetze().get(4).text()).contains("§ 14 Abs. 3");
+ assertThat(neu.norm("§ 2").orElseThrow().titel()).isEqualTo("Registriernummer");
+ assertThat(neu.norm("§ 6").orElseThrow().gesamtText()).contains("8 bis 10");
+ assertThat(neu.norm("§ 14")).isPresent();
+
+ var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false);
+ assertThat(HtmlRenderer.rendere(synopse, "E2E-Test NEFG")).contains("§ 1");
+ }
}