diff options
| author | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-08-27 07:26:13 +0200 |
|---|---|---|
| committer | Matthias Andreas Benkard <code@mail.matthias.benkard.de> | 2026-08-27 07:26:13 +0200 |
| commit | eb998fbfc324151b0b712adb37525caf2320211e (patch) | |
| tree | dee2017ef67e5952f81f492c90278c7525cd6eca /src/test/java | |
| parent | 036fb101bbc92e88e2b0e99d04ed827b96afd927 (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.java | 71 |
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() |
