diff options
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/eu/mulk/aendggner/EndToEndTest.java | 50 | ||||
| -rw-r--r-- | src/test/java/eu/mulk/aendggner/aenderung/parse/ZusammenstellungsLeserTest.java | 92 |
2 files changed, 134 insertions, 8 deletions
diff --git a/src/test/java/eu/mulk/aendggner/EndToEndTest.java b/src/test/java/eu/mulk/aendggner/EndToEndTest.java index 212e070..55579f1 100644 --- a/src/test/java/eu/mulk/aendggner/EndToEndTest.java +++ b/src/test/java/eu/mulk/aendggner/EndToEndTest.java @@ -1024,20 +1024,54 @@ class EndToEndTest { } /** - * Eine Beschlussempfehlung wird als solche erkannt und mit Begründung übergangen, statt eine halb - * aufgelöste Fassung auszugeben. Die Meldung nennt den Entwurf, der stattdessen taugt. + * Aus einer Beschlussempfehlung entsteht die Synopse der <em>beschlossenen</em> Fassung: Die + * Pipeline löst die zweispaltige Zusammenstellung auf, statt die Datei zu übergehen. + * + * <p>Gepinnt ist die Zahl der angewandten Befehle. Der große Rest bleibt aus demselben Grund + * manuell wie beim Regierungsentwurf daneben (BT-Drs. 20/6875, {@link + * #gegGrossesAenderungsgesetz}): Das Beispiel-XML ist die Urfassung des GEG von 2020, geändert + * wird eine Fassung von 2023. Maßgeblich ist deshalb der Vergleich mit dem Entwurf — die + * Ausschussfassung muss <em>mehr</em> Befehle tragen, denn der Ausschuss hat zwei Artikel + * hinzugefügt (BGB und Betriebskostenverordnung). */ @Test - void beschlussempfehlungWirdMitBegruendungUebergangen() throws Exception { + void beschlussempfehlungLiefertDieAusschussfassung() throws Exception { var xml = SAMPLEDATA.resolve("GEG/BJNR172810020.xml"); - var pdf = SAMPLEDATA.resolve("GEG/BT-Drs-20-7619_Beschlussempfehlung.pdf"); - assumeTrue(Files.exists(xml) && Files.exists(pdf), "GEG-Beispieldaten fehlen"); + var empfehlung = SAMPLEDATA.resolve("GEG/BT-Drs-20-7619_Beschlussempfehlung.pdf"); + var entwurf = SAMPLEDATA.resolve("GEG/BT-Drs-20-6875_Regierungsentwurf.pdf"); + assumeTrue( + Files.exists(xml) && Files.exists(empfehlung) && Files.exists(entwurf), + "GEG-Beispieldaten fehlen"); + + var ausEmpfehlung = Pipeline.erzeugeSynopse(xml, List.of(empfehlung), null, false); + var ausEntwurf = Pipeline.erzeugeSynopse(xml, List.of(entwurf), null, false); + + assertThat(ausEmpfehlung.anzahlAngewandt()).isEqualTo(67); + assertThat(ausEmpfehlung.anzahlAngewandt() + ausEmpfehlung.anzahlManuell()) + .as("die Ausschussfassung trägt mehr Befehle als der Entwurf") + .isGreaterThan(ausEntwurf.anzahlAngewandt() + ausEntwurf.anzahlManuell()); + // Die Quellenzeile muss sagen, welche der beiden Spalten gilt. + assertThat(ausEmpfehlung.html()).contains(", Ausschussfassung]"); + } + + /** + * Derselbe Weg auf einer zweiten Beschlussempfehlung — dem Dritten Bevölkerungsschutzgesetz + * (BT-Drs. 19/24334) —, damit der Leser nicht am GEG-Heft hängt. + * + * <p>Zwei Befehle bleiben hier unerkannt, beide wegen Setzfehlern der amtlichen Drucksache: In + * Nummer 16 b) fehlt der Schlusspunkt („… eingefügt“), und Artikel 3 Nummer 1 b) trägt ein + * überzähliges schließendes Anführungszeichen. Beides ist zeichengenau so übernommen. + */ + @Test + void beschlussempfehlungBevoelkerungsschutzgesetz() throws Exception { + var xml = SAMPLEDATA.resolve("IfSG/BJNR104510000.xml"); + var pdf = SAMPLEDATA.resolve("IfSG/1924334.pdf"); + assumeTrue(Files.exists(xml) && Files.exists(pdf), "IfSG-Beispieldaten fehlen"); var ergebnis = Pipeline.erzeugeSynopse(xml, List.of(pdf), null, false); - assertThat(ergebnis.anzahlAngewandt()).isZero(); - assertThat(ergebnis.html()).contains("Beschlussempfehlung"); - assertThat(ergebnis.html()).contains("Drs. 20/6875"); + assertThat(ergebnis.anzahlAngewandt()).isEqualTo(47); + assertThat(ergebnis.html()).contains(", Ausschussfassung]"); } /** diff --git a/src/test/java/eu/mulk/aendggner/aenderung/parse/ZusammenstellungsLeserTest.java b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZusammenstellungsLeserTest.java new file mode 100644 index 0000000..8e994a6 --- /dev/null +++ b/src/test/java/eu/mulk/aendggner/aenderung/parse/ZusammenstellungsLeserTest.java @@ -0,0 +1,92 @@ +package eu.mulk.aendggner.aenderung.parse; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assumptions.assumeTrue; + +import java.nio.file.Files; +import java.nio.file.Path; +import org.apache.pdfbox.Loader; +import org.junit.jupiter.api.Test; + +/** + * Die Auflösung der Zusammenstellung einer Beschlussempfehlung am Beispiel der GEG-Novelle (BT-Drs. + * 20/7619). Geprüft wird nicht die Befehlszahl — das tut der {@code EndToEndTest} —, sondern jede + * der vier Entscheidungen, die der Leser zeilenweise trifft. + */ +class ZusammenstellungsLeserTest { + + private static final Path EMPFEHLUNG = + Path.of("src/main/resources/sampledata/GEG/BT-Drs-20-7619_Beschlussempfehlung.pdf"); + + private static String fassung() throws Exception { + try (var dokument = Loader.loadPDF(EMPFEHLUNG.toFile())) { + var ergebnis = ZusammenstellungsLeser.lies(dokument, SuperskriptModus.ENTFERNEN); + assertThat(ergebnis.warnungen()).isEmpty(); + assertThat(ergebnis.text()).isNotNull(); + return TextBereiniger.bereinige(ergebnis.text()); + } + } + + /** Wo die Ausschussspalte ausgeschrieben ist, gilt sie — nicht der Entwurf daneben. */ + @Test + void ausgeschriebeneAusschussfassungVerdraengtDenEntwurf() throws Exception { + assumeTrue(Files.exists(EMPFEHLUNG), "GEG-Beispieldaten fehlen"); + var fassung = fassung(); + + assertThat(fassung).contains("13. Die §§ 34 bis 45 werden wie folgt gefasst:"); + assertThat(fassung) + .as("die Entwurfsfassung desselben Punktes darf nicht danebenstehen") + .doesNotContain("Die Angaben zu den §§ 34 bis 45"); + } + + /** + * „Unverändert“ holt den Wortlaut aus der Entwurfsspalte — auch zeilenweise innerhalb eines + * Zitats, wo die Ausschussspalte für sich gelesen ihre Anführungszeichen nicht schlösse. + */ + @Test + void unveraendertHoltDenWortlautAusDerEntwurfsspalte() throws Exception { + assumeTrue(Files.exists(EMPFEHLUNG), "GEG-Beispieldaten fehlen"); + var fassung = fassung(); + + assertThat(fassung).contains("„§ 34 (weggefallen)"); + assertThat(fassung).contains("§ 45 (weggefallen)“"); + assertThat(fassung).doesNotContain("unverändert"); + } + + /** + * „Unverändert“ meint den Wortlaut, nicht die Zählung: Der Ausschuss streicht die Entwurfsnummer + * 5, seine eigene Nummer 5 ist die Nummer 6 des Entwurfs — mit dessen Wortlaut. + */ + @Test + void umnummerierterPunktBehaeltDenWortlautUndErhaeltDieNeueMarke() throws Exception { + assumeTrue(Files.exists(EMPFEHLUNG), "GEG-Beispieldaten fehlen"); + var fassung = fassung(); + + assertThat(fassung) + .contains("„5. die Anforderungen an den Einbau von Heizungsanlagen bei Nutzung von fester"); + assertThat(fassung).doesNotContain("6. die Anforderungen an den Einbau von Heizungsanlagen"); + } + + /** Ein gestrichener Punkt hinterlässt nichts — weder den Vermerk noch den Entwurfstext. */ + @Test + void gestrichenerPunktHinterlaesstNichts() throws Exception { + assumeTrue(Files.exists(EMPFEHLUNG), "GEG-Beispieldaten fehlen"); + var fassung = fassung(); + + assertThat(fassung).doesNotContain("bb) entfällt"); + assertThat(fassung) + .as("der vom Ausschuss gestrichene Entwurfstext gehört nicht in die beschlossene Fassung") + .doesNotContain("„1. eine Umwälzpumpe nach § 64"); + } + + /** + * Der quer am Blattrand stehende Vorabfassungs-Vermerk hat keine Grundlinie im Satzspiegel; er + * würde die Zeilenfolge zerschneiden und bleibt deshalb draußen. + */ + @Test + void gedrehterRandvermerkKommtNichtInDenText() throws Exception { + assumeTrue(Files.exists(EMPFEHLUNG), "GEG-Beispieldaten fehlen"); + + assertThat(fassung()).doesNotContain("lektorierte"); + } +} |
