aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-27 07:26:13 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2026-08-27 07:26:13 +0200
commiteb998fbfc324151b0b712adb37525caf2320211e (patch)
treedee2017ef67e5952f81f492c90278c7525cd6eca /src/test/java
parent036fb101bbc92e88e2b0e99d04ed827b96afd927 (diff)
Mecklenburg-Vorpommern wählt seinen Artikel aus sechzig
Mecklenburg-Vorpommern tritt als sechzehntes Land hinzu. Sein Gesetzblatt liegt vollständig offen (Jahrgänge ab 2014, rund 440 Hefte); das Portal dagegen ist eine juris-Einseitenanwendung ohne Fassungsliste. Die Vorfassung kommt deshalb aus dem Gesetzblatt selbst: Nennt der Einleitungssatz die Stammvorschrift ohne jede frühere Änderung, so ist die Ursprungsfassung beweisbar die Vorfassung. Der Fall — Artikel 44 des Besoldungsanpassungsgesetzes vom 8. Juli 2026, der die Ausbildungs- und Prüfungsordnung amtstierärztlicher Dienst ändert — prüft die Artikelwahl schärfer als jeder bisherige: Das Heft trägt ein Mantelgesetz mit rund sechzig Artikeln, von denen jeder ein anderes Werk ändert. Er prüft ferner die Inhaltsübersicht als eigene Norm, deren Angabe zu § 10 der erste und deren Überschrift der siebte Befehl ändert. Zwei Ergänzungen waren nötig: die Muster für Kolumnentitel und Seitenfuß des Blattes (beide stehen im Inhaltsstrom, mitten im Befehlstext) und die Nebenform „die Angabe zu § 10 wird durch die folgende Angabe ersetzt“. Die vier liegen gebliebenen Befehle betreffen sämtlich die Anlagen, die die Stammfassung als Tabellen und Vordrucke nicht mitführt. Eine Nachfassung gibt es nicht: Der Artikel tritt erst am 1. September 2026 in Kraft, weshalb die Gesamtausgabe des Portals noch die Vorfassung ist — sie hat dieser als Gegenprobe gedient. Geprüft: mvnw verify (430 Testfälle) und reuse lint (207/207) gehen durch; der neue Akzeptanzfall pinnt die Wahl des Artikels 44, 24 gelesene und 20 angewandte Befehle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: Ic7f04bbd6326f2e34e50fab5b67eb8b2db346410
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
index 6bb82eb..eead6a0 100644
--- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java
+++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java
@@ -1851,6 +1851,77 @@ class EndToEndTest {
.containsExactly("§ 22", "§ 29");
}
+ /**
+ * Mecklenburg-Vorpommern: Die Ausbildungs- und Prüfungsordnung amtstierärztlicher Dienst,
+ * geändert durch <em>Artikel 44</em> des Gesetzes über die Anpassung von Besoldungs- und
+ * Beamtenversorgungsbezügen … vom 8. Juli 2026 (GVOBl. M-V Nr. 21 vom 21. Juli 2026, S. 719,
+ * 740).
+ *
+ * <p>Der Fall prüft zweierlei, was bisher kein anderer prüfte. Erstens die <em>Artikelwahl</em>:
+ * Das Heft trägt ein Mantelgesetz mit rund sechzig Artikeln, von denen jeder ein anderes Werk
+ * ändert; gewählt werden muss der eine, der dieses trifft. Zweitens die <em>Inhaltsübersicht als
+ * eigene Norm</em>: Der erste Befehl ändert deren Angabe zu § 10, der siebte die Überschrift des
+ * § 10 selbst — beides muss zusammenpassen.
+ *
+ * <p>Eine Nachfassung gibt es nicht: Die Änderung tritt erst am 1. September 2026 in Kraft, und
+ * das Portal führt allein die geltende Gesamtausgabe. Sie ist eben deshalb die Vorfassung, gegen
+ * die {@code APOAmtsTA-MV-alt.txt} geprüft worden ist (siehe {@code
+ * MecklenburgVorpommern/SOURCES}).
+ */
+ @Test
+ void apoAmtsTaMecklenburgVorpommern() throws Exception {
+ var alt = SAMPLEDATA.resolve("MecklenburgVorpommern/APOAmtsTA-MV-alt.txt");
+ var pdf =
+ SAMPLEDATA.resolve("MecklenburgVorpommern/GVOBl-MV-2026-21_Besoldungsanpassung-ua.pdf");
+ assumeTrue(Files.exists(alt) && Files.exists(pdf), "Mecklenburger Beispieldaten fehlen");
+
+ var gesetz = new eu.mulk.aendggner.gesetz.land.LandesRechtLoader().load(alt);
+ assertThat(gesetz.jurabk()).isEqualTo("APOAmtsTA M-V");
+ // Die Inhaltsübersicht ist eine Norm gleichen Namens; dazu die 28 Paragraphen.
+ assertThat(gesetz.normen()).hasSize(29);
+
+ var text = TextBereiniger.bereinige(new PatchTextExtraktor().extrahiere(pdf));
+ // Kolumnentitel und Seitenfuß stehen im Inhaltsstrom, und zwar mitten im Befehlstext.
+ assertThat(text).doesNotContain("Tag der Ausgabe: Schwerin, den 21. Juli 2026 741");
+
+ var parseErgebnis = new AenderungsgesetzParser().parse(text, gesetz, null);
+ // Aus rund sechzig Artikeln des Mantelgesetzes wird der eine gewählt, der die Verordnung
+ // trifft.
+ assertThat(parseErgebnis.artikel()).containsExactly("44");
+ assertThat(parseErgebnis.befehle()).hasSize(24);
+
+ var anwendung = BefehlAnwender.anwenden(gesetz, parseErgebnis.befehle());
+ assertThat(anwendung.anzahlAngewandt()).isEqualTo(20);
+
+ // Die Nummern 2 und 3 entfallen, die Nummern 4 bis 6 rücken auf 2 bis 4 — ohne Platzhalter,
+ // denn sie stehen am Ende ihres Blockes nicht.
+ var dritter = anwendung.neu().norm("§ 3").orElseThrow().absaetze().get(1).text();
+ assertThat(dritter)
+ .contains("\n 2. Zeugnisse über die tierärztliche Prüfung,")
+ .contains("\n 4. ein Nachweis über die in § 2 Satz 1 Nummer 5 geforderte Tätigkeit.")
+ .doesNotContain("ein aktuelles Lichtbild");
+
+ // Die Überschrift des § 10 und die Angabe zu § 10 in der Inhaltsübersicht gehen zusammen.
+ var zehnter = anwendung.neu().norm("§ 10").orElseThrow();
+ assertThat(zehnter.titel()).isEqualTo("Ausbildungsnachweise");
+ assertThat(zehnter.absaetze().get(0).text())
+ .contains(
+ "einen Ausbildungsnachweis nach Anlage 2 zu fertigen. Diese beinhalten die"
+ + " ausbildungsbegleitenden Leistungskontrollen nach § 8 Satz 2.");
+ assertThat(anwendung.neu().norm("Inhaltsübersicht").orElseThrow().absaetze().get(0).text())
+ .contains("§ 10 | Ausbildungsnachweise");
+
+ // Übrig bleiben allein die vier Befehle, die die Anlagen betreffen: Die Stammfassung führt sie
+ // nicht mit (Tabellen und Vordrucke), und der elfte Befehl verweist auf einen Anhang des
+ // Änderungsgesetzes.
+ var offen =
+ anwendung.protokoll().stream()
+ .filter(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN)
+ .map(a -> a.befehl().provenienz().gliederungsPfad())
+ .toList();
+ assertThat(offen).containsExactly("10. a)", "10. b)", "10. c)", "11.");
+ }
+
private static Aenderungsbefehl befehlZu(
AenderungsgesetzParser.ParseErgebnis ergebnis, String gliederungsPfad) {
return ergebnis.befehle().stream()