diff options
| author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-07-24 22:29:35 +0200 |
|---|---|---|
| committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-07-24 22:29:35 +0200 |
| commit | 43e91612875de3cc6e7466eee56023ab55cefd89 (patch) | |
| tree | 867f602cd8b00a320987cde8947778deaa7efa45 /src/test/java | |
| parent | 3f81addcfbeae7aabcdd823340397f66e394f02f (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/java')
| -rw-r--r-- | src/test/java/eu/mulk/aendggner/EndToEndTest.java | 61 |
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"); + } } |
