aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java38
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java21
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/TextBereinigerTest.java12
-rw-r--r--src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java33
4 files changed, 89 insertions, 15 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index b89a367..e7f7a00 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -402,21 +402,18 @@ class EndToEndTest {
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.
+ // Alle sieben Befehle werden angewandt, darunter die beiden niedersächsischen Einfügeformen:
+ // * Nr. 3 „Nach § 2 wird der folgende § 2 a eingefügt“ — Sachnummer mit Leerzeichen.
+ // * Nr. 5 „In Kapitel 4 wird nach § 12 der folgende neue § 13 angefügt“ — gliederungs-
+ // bezogene Einfügung, deren Zielbezeichnung erst der nachfolgende Befehl Nr. 6 freimacht.
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.");
+ assertThat(anwendung.anzahlAngewandt()).isEqualTo(7);
+ assertThat(anwendung.protokoll())
+ .noneMatch(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN);
+ // Protokolliert wird trotz vorgezogener Umnummerierung in der Reihenfolge des Gesetzes.
+ assertThat(anwendung.protokoll())
+ .extracting(a -> a.befehl().provenienz().gliederungsPfad())
+ .containsExactly("1. a)", "1. b)", "2.", "3.", "4.", "5.", "6.");
// 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).
@@ -426,7 +423,18 @@ class EndToEndTest {
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();
+
+ // Die beiden neuen Paragraphen stehen an der richtigen Stelle, der bisherige § 13 ist § 14.
+ assertThat(neu.normen()).hasSize(15);
+ assertThat(neu.normen())
+ .extracting(n -> n.enbez())
+ .containsSubsequence("§ 2", "§ 2a", "§ 3")
+ .containsSubsequence("§ 12", "§ 13", "§ 14");
+ assertThat(neu.norm("§ 2a").orElseThrow().titel())
+ .isEqualTo("Anwendung bundesrechtlicher Vorschriften");
+ assertThat(neu.norm("§ 13").orElseThrow().titel())
+ .isEqualTo("Entbehrlichkeit von Vergabeverfahren im Unterschwellenbereich");
+ assertThat(neu.norm("§ 14").orElseThrow().titel()).isEqualTo("Verordnungsermächtigungen");
var synopse = SynopseBuilder.baue(gesetz, anwendung, parseErgebnis.warnungen(), false);
assertThat(HtmlRenderer.rendere(synopse, "E2E-Test NEFG")).contains("§ 1");
diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
index d89c898..5213030 100644
--- a/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
+++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/BefehlErkennerTest.java
@@ -126,6 +126,27 @@ class BefehlErkennerTest {
}
@Test
+ void erkenntGliederungsbezogeneParagraphEinfuegung() {
+ // Echter Befehl aus Art. 1 Nr. 5 des Änderungsgesetzes zum NEFG (Nds. GVBl. 2026 Nr. 10). Die
+ // Kapitelangabe nennt nur den Abschnitt, in dem der neue Paragraph landet; maßgeblich für die
+ // Position ist der Anker „nach § 12“.
+ var befehl =
+ erkenne(
+ "In Kapitel 4 wird nach § 12 der folgende neue § 13 angefügt: „§ 13 Entbehrlichkeit"
+ + " von Vergabeverfahren im Unterschwellenbereich Das Gesetz ist nicht"
+ + " anzuwenden.“",
+ Stelle.LEER);
+
+ assertThat(befehl).containsInstanceOf(StrukturEinfuegung.class);
+ var einfuegung = (StrukturEinfuegung) befehl.orElseThrow();
+ assertThat(einfuegung.stelle().anzeigeText()).isEqualTo("§ 12");
+ assertThat(einfuegung.vorher()).isFalse();
+ assertThat(einfuegung.ebene()).isEqualTo(Ebene.PARAGRAPH);
+ assertThat(einfuegung.bezeichnung()).isEqualTo("13");
+ assertThat(einfuegung.text()).startsWith("§ 13 Entbehrlichkeit");
+ }
+
+ @Test
void erkenntSatzEinfuegung() {
var befehl =
erkenne(
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 f49e41b..4da5c79 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,18 @@ class TextBereinigerTest {
}
@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:"))
+ .isEqualTo("Nach § 2 wird der folgende § 2a eingefügt:");
+ assertThat(TextBereiniger.bereinige("Art. 28 a Abs. 1")).isEqualTo("Art. 28a Abs. 1");
+ // Aufzählungsmarker des Änderungsgesetzes bleiben unberührt, ebenso echte Folgewörter.
+ assertThat(TextBereiniger.bereinige("Nach § 8 c) In Absatz 2"))
+ .isEqualTo("Nach § 8 c) In Absatz 2");
+ assertThat(TextBereiniger.bereinige("§ 5 des Gesetzes")).isEqualTo("§ 5 des Gesetzes");
+ }
+
+ @Test
void entferntSeitenkopfDesGvoblSchleswigHolstein() {
var roh =
"""
diff --git a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
index a23f444..a8f3daa 100644
--- a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
+++ b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java
@@ -1134,4 +1134,37 @@ class BefehlAnwenderTest {
assertThat(absatzText(ergebnis.neu(), "Art. 2", 0))
.isEqualTo("Erprobung ist die Prüfung der Tauglichkeit; sie schließt mit einem Bericht.");
}
+
+ @Test
+ void ziehtUmnummerierungVorDieNeubesetzendeEinfuegung() {
+ // „Nach § 2 wird der folgende neue § 3 eingefügt“ + „Der bisherige § 3 wird § 4“: In der
+ // Textreihenfolge angewandt kollidierten beide Befehle auf „§ 3“. Die Umnummerierung
+ // beschreibt den Stand vor der Änderung und geht der Neubesetzung sachlich voraus.
+ var einfuegung =
+ new StrukturEinfuegung(
+ stelle(new Stelle.Paragraph("2")),
+ false,
+ Ebene.PARAGRAPH,
+ "3",
+ "§ 3 Zwischennorm (1) Der neue Text.",
+ PROV);
+ var umnummerierung =
+ new Umnummerierung(
+ stelle(new Stelle.Paragraph("3")),
+ stelle(new Stelle.Paragraph("4")),
+ new Provenienz("1", "2.", "(Test)"));
+
+ var ergebnis = BefehlAnwender.anwenden(gesetz(), List.of(einfuegung, umnummerierung));
+
+ assertThat(ergebnis.anzahlAngewandt()).isEqualTo(2);
+ // Protokolliert wird weiterhin in der Reihenfolge des Änderungsgesetzes.
+ assertThat(ergebnis.protokoll())
+ .extracting(a -> a.befehl().provenienz().gliederungsPfad())
+ .containsExactly("1.", "2.");
+ assertThat(ergebnis.neu().normen())
+ .extracting(n -> n.enbez())
+ .containsExactly("§ 1", "§ 2", "§ 3", "§ 4");
+ assertThat(ergebnis.neu().norm("§ 3").orElseThrow().titel()).isEqualTo("Zwischennorm");
+ assertThat(ergebnis.neu().norm("§ 4").orElseThrow().titel()).isEqualTo("Schlussvorschriften");
+ }
}