blob: 38b4076b32497146d4b3e7e4ba837f56a23080b2 [file] [log] [blame]
// SPDX-FileCopyrightText: 2026 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
// SPDX-License-Identifier: AGPL-3.0-or-later
package eu.mulk.aendggner.anwendung;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
class SatzTeilerTest {
@Test
void teiltEinfacheSaetze() {
assertThat(SatzTeiler.teileTexte("Erster Satz. Zweiter Satz. Dritter Satz."))
.containsExactly("Erster Satz.", "Zweiter Satz.", "Dritter Satz.");
}
@Test
void teiltNichtBeiAbkuerzungen() {
assertThat(
SatzTeiler.teileTexte(
"Die Meldung erfolgt nach Abs. 2 und § 5 Nr. 3 des Gesetzes. Sie ist"
+ " schriftlich abzugeben."))
.containsExactly(
"Die Meldung erfolgt nach Abs. 2 und § 5 Nr. 3 des Gesetzes.",
"Sie ist schriftlich abzugeben.");
}
@Test
void teiltNichtBeiDatumsangaben() {
assertThat(
SatzTeiler.teileTexte(
"Die Regelung gilt bis zum 31. März 2021. Danach tritt sie außer Kraft."))
.containsExactly(
"Die Regelung gilt bis zum 31. März 2021.", "Danach tritt sie außer Kraft.");
}
@Test
void teiltVorZitatUndKlammer() {
assertThat(SatzTeiler.teileTexte("Es gilt Satz 1. „Zitat folgt.“ (Klammer folgt.)")).hasSize(3);
}
@Test
void teiltAnAmtlichenSatznummern() {
// Bayerisches Landesrecht: hochgestellte Satznummern sind exakte Satzgrenzen — auch dort,
// wo die Heuristik versagen würde (Abkürzung am Satzende).
var text = "¹Die Förderung erfolgt gem. Art. 26 und 27. ²Sie ist als Teil zu bewahren.";
assertThat(SatzTeiler.teileTexte(text))
.containsExactly(
"¹Die Förderung erfolgt gem. Art. 26 und 27.", "²Sie ist als Teil zu bewahren.");
assertThat(SatzTeiler.nummerVonSatz("²Sie ist als Teil zu bewahren.")).isEqualTo(2);
assertThat(SatzTeiler.nummerVonSatz("Ohne Nummer.")).isNull();
}
@Test
void fussnotenmarkerIstKeinSatzanfang() {
// „Enteignung⁶)“ mitten im Satz und die Fußnotenzeile „⁶) …“ eröffnen keinen neuen Satz.
var text =
"¹Es gilt das Gesetz über die entschädigungspflichtige Enteignung⁶) entsprechend."
+ " ²Näheres regelt die Verordnung.\n⁶) [Amtl. Anm.:] BayRS 2141-1-I";
var saetze = SatzTeiler.teileTexte(text);
assertThat(saetze).hasSize(2);
assertThat(saetze.get(0)).contains("Enteignung⁶)");
assertThat(saetze.get(1)).startsWith("²Näheres").contains("⁶) [Amtl. Anm.:]");
}
@Test
void behandeltAufzaehlungenAlsTeilDesSatzes() {
var text =
"Die Erprobung umfasst\n"
+ " 1. das Einlesen,\n"
+ " 2. die Anwendung und\n"
+ " 3. die Ausgabe. Weitere Einzelheiten regelt die Verordnung.";
var saetze = SatzTeiler.teileTexte(text);
assertThat(saetze).hasSize(2);
assertThat(saetze.get(0)).contains("2. die Anwendung und");
assertThat(saetze.get(1)).isEqualTo("Weitere Einzelheiten regelt die Verordnung.");
}
@Test
void aufzaehlungsmarkeAmZeilenanfangBeendetKeinenSatz() {
// Anders als im Test darüber beginnen die Glieder großgeschrieben — erst die Marke am
// Zeilenanfang unterscheidet sie von einer Zahl am Satzende.
var text =
"Dem Rundfunkrat obliegen insbesondere folgende Aufgaben\n"
+ "1. Erlaß von Satzungen,\n"
+ "2. Wahl der Intendantin oder des Intendanten.\n"
+ "Vor Beschlüssen ist Gelegenheit zur Stellungnahme zu geben.";
var saetze = SatzTeiler.teileTexte(text);
assertThat(saetze).hasSize(2);
assertThat(saetze.get(0)).contains("2. Wahl der Intendantin");
assertThat(saetze.get(1)).startsWith("Vor Beschlüssen");
}
@Test
void zahlAmSatzendeBeendetDenSatz() {
var saetze = SatzTeiler.teileTexte("Die Frist beträgt 30. Der Lauf beginnt am Folgetag.");
assertThat(saetze).containsExactly("Die Frist beträgt 30.", "Der Lauf beginnt am Folgetag.");
}
@Test
void fundstellenAbkuerzungTeiltDenSatzNicht() {
var saetze =
SatzTeiler.teileTexte(
"Es gilt das Gesetz vom 23. Juni 2021 (BGBl. I S. 1982) in der geltenden Fassung."
+ " Näheres regelt die Satzung.");
assertThat(saetze).hasSize(2);
assertThat(saetze.get(0)).endsWith("in der geltenden Fassung.");
}
@Test
void paragraphenzeichenEroeffnetEinenSatz() {
var saetze =
SatzTeiler.teileTexte(
"Die Angebote können zusammengefasst werden. § 27 Absatz 2 bleibt unberührt.");
assertThat(saetze)
.containsExactly(
"Die Angebote können zusammengefasst werden.", "§ 27 Absatz 2 bleibt unberührt.");
}
}