aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/eu/mulk/aendggner/EndToEndTest.java50
-rw-r--r--src/test/java/eu/mulk/aendggner/aenderung/parse/ZusammenstellungsLeserTest.java92
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");
+ }
+}