diff options
Diffstat (limited to 'src/test/java/eu')
| -rw-r--r-- | src/test/java/eu/mulk/aendggner/EndToEndTest.java | 21 | ||||
| -rw-r--r-- | src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java | 114 |
2 files changed, 128 insertions, 7 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java index 7a6dcee..41f30e5 100644 --- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java +++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java @@ -293,8 +293,8 @@ class EndToEndTest { .filter(a -> a.status() == BefehlAnwender.Status.MANUELL_PRUEFEN) .map(a -> a.befehl().provenienz().gliederungsPfad()) .toList(); - assertThat(manuellPfade).containsExactly("40. a) hh)"); - assertThat(anwendung.anzahlAngewandt()).isEqualTo(118); + assertThat(manuellPfade).isEmpty(); + assertThat(anwendung.anzahlAngewandt()).isEqualTo(119); // Die Kaskade des § 108 Absatz 1 geht lückenlos auf: 32 Nummern, keine doppelt, keine fehlend. var nummern = @@ -312,6 +312,13 @@ class EndToEndTest { assertThat(nummern).hasSize(32).endsWith("32"); var neu = anwendung.neu(); + // Die Begleitklausel der Nummer 18/29 hat allein dort gegriffen — der Wortlaut gleicht der + // amtlichen Nachfassung (BJNR172810020.xml, § 108 Absatz 1 Nummer 29). + var paragraph108 = neu.norm("§ 108").orElseThrow().absaetze().get(0).text(); + assertThat(paragraph108) + .contains("29. entgegen § 96 Absatz 1 oder Absatz 4 eine Bestätigung nicht") + .contains("30. entgegen § 96 Absatz 5 Satz 2 eine Abrechnung nicht"); + // Die Überschrift der Nummer 1 der Anlage 8 ist geändert — und nur sie: Der Titel der Anlage // trägt seinen eigenen Wortlaut unversehrt, den Punkt 43. a) ihm gegeben hat. var anlage8 = neu.norm("Anlage 8").orElseThrow(); @@ -1722,14 +1729,14 @@ class EndToEndTest { assumeTrue(Files.exists(xml) && Files.exists(pdf), "GEG-Beispieldaten fehlen"); var vollstaendig = Pipeline.erzeugeSynopse(Pipeline.Auftrag.von(xml, List.of(pdf))); - assertThat(vollstaendig.anzahlAngewandt()).isEqualTo(118); - assertThat(vollstaendig.anzahlManuell()).isEqualTo(1); + assertThat(vollstaendig.anzahlAngewandt()).isEqualTo(119); + assertThat(vollstaendig.anzahlManuell()).isZero(); var anfang2024 = Pipeline.erzeugeSynopse( Pipeline.Auftrag.von(xml, List.of(pdf)).mitStichtag(LocalDate.of(2024, 1, 1))); - assertThat(anfang2024.anzahlAngewandt()).isEqualTo(117); - assertThat(anfang2024.anzahlManuell()).isEqualTo(1); + assertThat(anfang2024.anzahlAngewandt()).isEqualTo(118); + assertThat(anfang2024.anzahlManuell()).isZero(); assertThat(anfang2024.html()) .contains("Am Stichtag noch nicht in Kraft") .contains("Tritt erst am 1. Oktober 2024 in Kraft"); @@ -1737,7 +1744,7 @@ class EndToEndTest { var oktober2024 = Pipeline.erzeugeSynopse( Pipeline.Auftrag.von(xml, List.of(pdf)).mitStichtag(LocalDate.of(2024, 10, 1))); - assertThat(oktober2024.anzahlAngewandt()).isEqualTo(118); + assertThat(oktober2024.anzahlAngewandt()).isEqualTo(119); } /** diff --git a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java index 0e186ad..a1f5cff 100644 --- a/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java +++ b/src/test/java/eu/mulk/aendggner/anwendung/BefehlAnwenderTest.java @@ -4,6 +4,7 @@ package eu.mulk.aendggner.anwendung; import static org.assertj.core.api.Assertions.assertThat; +import eu.mulk.aendggner.aenderung.Aenderungsbefehl; import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Anfuegung; import eu.mulk.aendggner.aenderung.Aenderungsbefehl.Aufhebung; import eu.mulk.aendggner.aenderung.Aenderungsbefehl.BereichsUmnummerierung; @@ -1777,4 +1778,117 @@ class BefehlAnwenderTest { assertThat(ergebnis.protokoll().get(0).grund()).isEqualTo(Grund.NICHT_UNTERSTUETZT); assertThat(ergebnis.neu().norm("Anlage 8").orElseThrow().titel()).isEqualTo("Anforderungen"); } + + private static Gesetz bussgeldkatalog() { + return new Gesetz( + "TestG", + "Testgesetz", + "TestG", + List.of( + new Norm( + "§ 108", + "Bußgeldvorschriften", + null, + List.of( + new Absatz( + "1", + "17. entgegen § 90 Absatz 1 etwas tut,\n" + + "18. entgegen § 96 Absatz 1 etwas unterlässt,\n" + + "19. entgegen § 97 Absatz 1 etwas anderes tut,")), + false))); + } + + private static Sammelbefehl verbund(Aenderungsbefehl... teile) { + return new Sammelbefehl(List.of(teile)); + } + + /** + * „Die bisherige Nummer 18 wird Nummer 29 und nach der Angabe ‚Absatz 1‘ werden die Wörter ‚oder + * Absatz 4‘ eingefügt.“ — Der Anker steht in jeder Nummer; norm-weit ist er mehrdeutig. Erst dann + * entscheidet die soeben umnummerierte Einheit. + */ + @Test + void mehrdeutigeBegleitklauselFaelltAufDieUmnummerierteEinheitZurueck() { + var rahmen = stelle(new Stelle.Paragraph("108"), new Stelle.AbsatzNr("1")); + var befehl = + verbund( + new Umnummerierung( + rahmen.plus(stelle(new Stelle.NummerNr("18"))), + stelle(new Stelle.NummerNr("29")), + PROV), + new WoerterEinfuegung( + rahmen, new WortAnker.NachWoertern("Absatz 1"), "oder Absatz 4", PROV)); + + var ergebnis = BefehlAnwender.anwenden(bussgeldkatalog(), List.of(befehl)); + assertThat(ergebnis.protokoll()).allMatch(a -> a.status() == Status.ANGEWANDT); + + var text = ergebnis.neu().norm("§ 108").orElseThrow().absaetze().get(0).text(); + // Allein die umnummerierte Nummer hat die Wörter bekommen. + assertThat(text).contains("29. entgegen § 96 Absatz 1 oder Absatz 4 etwas unterlässt,"); + assertThat(text).contains("17. entgegen § 90 Absatz 1 etwas tut,"); + assertThat(text).contains("19. entgegen § 97 Absatz 1 etwas anderes tut,"); + } + + /** + * Der Rückfall greift nur bei Mehrdeutigkeit, nie bei fehlendem Zieltext: Wer seinen Anker + * nirgends findet, meint etwas anderes — ihn in die umnummerierte Einheit zu zwingen wäre eine + * Falschanwendung, keine Verfeinerung. + */ + @Test + void fehlenderZieltextFaelltNichtZurueck() { + var rahmen = stelle(new Stelle.Paragraph("108"), new Stelle.AbsatzNr("1")); + var befehl = + verbund( + new Umnummerierung( + rahmen.plus(stelle(new Stelle.NummerNr("18"))), + stelle(new Stelle.NummerNr("29")), + PROV), + new WoerterEinfuegung( + rahmen, new WortAnker.NachWoertern("Paragraph 1"), "oder Absatz 4", PROV)); + + var ergebnis = BefehlAnwender.anwenden(bussgeldkatalog(), List.of(befehl)); + assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.MANUELL_PRUEFEN); + assertThat(ergebnis.neu().norm("§ 108").orElseThrow().absaetze().get(0).text()) + .doesNotContain("oder Absatz 4"); + } + + /** + * Bleibt der Anker auch in der umnummerierten Einheit mehrdeutig, so bleibt der Befehl liegen — + * und mit der Begründung des <em>ersten</em> Versuchs: Die Mehrdeutigkeit ist der wahre Befund. + */ + @Test + void mehrdeutigBleibtMehrdeutig() { + var gesetz = + new Gesetz( + "TestG", + "Testgesetz", + "TestG", + List.of( + new Norm( + "§ 108", + null, + null, + List.of( + new Absatz( + "1", + "17. entgegen § 90 Absatz 1 etwas tut,\n" + + "18. entgegen § 96 Absatz 1 und § 97 Absatz 1 etwas unterlässt,")), + false))); + var rahmen = stelle(new Stelle.Paragraph("108"), new Stelle.AbsatzNr("1")); + var befehl = + verbund( + new Umnummerierung( + rahmen.plus(stelle(new Stelle.NummerNr("18"))), + stelle(new Stelle.NummerNr("29")), + PROV), + new WoerterEinfuegung( + rahmen, new WortAnker.NachWoertern("Absatz 1"), "oder Absatz 4", PROV)); + + var ergebnis = BefehlAnwender.anwenden(gesetz, List.of(befehl)); + assertThat(ergebnis.protokoll().get(0).status()).isEqualTo(Status.MANUELL_PRUEFEN); + assertThat(ergebnis.protokoll().get(0).grund()).isEqualTo(Grund.MEHRDEUTIG); + assertThat(ergebnis.protokoll().get(0).begruendung()).contains("mehrdeutig"); + assertThat(ergebnis.neu().norm("§ 108").orElseThrow().absaetze().get(0).text()) + .doesNotContain("oder Absatz 4"); + } } |
