diff --git a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelementgruppen/Datenelementgruppe.kt b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelementgruppen/Datenelementgruppe.kt index 35adbb19..ad2b9c6a 100644 --- a/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelementgruppen/Datenelementgruppe.kt +++ b/fints4javaLib/src/main/kotlin/net/dankito/fints/messages/datenelementgruppen/Datenelementgruppe.kt @@ -3,13 +3,36 @@ package net.dankito.fints.messages.datenelementgruppen import net.dankito.fints.messages.Existenzstatus import net.dankito.fints.messages.Separators import net.dankito.fints.messages.datenelemente.DatenelementBase +import java.util.regex.Pattern abstract class Datenelementgruppe(val dataElements: List, existenzstatus: Existenzstatus) : DatenelementBase(existenzstatus) { + companion object { + val ReplaceEmptyDataElementsSeparatorsAtEndPattern = + Pattern.compile("${Separators.DataElementsSeparator}*\$") + } + + override fun format(): String { - return dataElements.joinToString(Separators.DataElementsSeparator) { it.format() } + val formattedDataElementGroup = dataElements.joinToString(Separators.DataElementsSeparator) { it.format() } + + return cutEmptyDataElementGroupsAtEndOfSegment(formattedDataElementGroup) + } + + /** + * Auslassen von Datenelementen durch Abschneiden + * Ist für DE, die am Ende eines Segments stehen, kein Inhalt vorhanden, können sie ausgelassen werden. + * In diesem Fall wird das Segmentende-Zeichen unmittelbar nach dem letzten mit Inhalt belegten DE angegeben. (...) + * + * Auslassen von Gruppendatenelementen + * Es gelten analog die Ausführungen zur Auslassung von Datenelementen. + */ + protected open fun cutEmptyDataElementGroupsAtEndOfSegment(formattedDataElementGroup: String): String { + val matcher = ReplaceEmptyDataElementsSeparatorsAtEndPattern.matcher(formattedDataElementGroup) + + return matcher.replaceFirst("") } } \ No newline at end of file diff --git a/fints4javaLib/src/test/kotlin/net/dankito/fints/messages/datenelementgruppen/DatenelementgruppeTest.kt b/fints4javaLib/src/test/kotlin/net/dankito/fints/messages/datenelementgruppen/DatenelementgruppeTest.kt new file mode 100644 index 00000000..97e0bf91 --- /dev/null +++ b/fints4javaLib/src/test/kotlin/net/dankito/fints/messages/datenelementgruppen/DatenelementgruppeTest.kt @@ -0,0 +1,56 @@ +package net.dankito.fints.messages.datenelementgruppen + +import net.dankito.fints.messages.Separators +import net.dankito.fints.messages.datenelementgruppen.implementierte.signatur.BenutzerdefinierteSignatur +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + + +class DatenelementgruppeTest { + + @Test + fun format_LastDataElementIsSet_GetsWrittenToOutput() { + + // given + val pin = "12345" + val tan = "654321" + val dataElementGroup = BenutzerdefinierteSignatur(pin, tan) + + // when + val result = dataElementGroup.format() + + // then + assertThat(result).isEqualTo(pin + Separators.DataElementsSeparator + tan) // ":" does not get written to output + } + + @Test + fun format_LastDataElementIsEmpty_EmptyLastDataElementDoesNotGetWrittenToOutput() { + + // given + val pin = "12345" + val tan = null + val dataElementGroup = BenutzerdefinierteSignatur(pin, tan) + + // when + val result = dataElementGroup.format() + + // then + assertThat(result).isEqualTo(pin) // ":" does not get written to output + } + + @Test + fun format_AllDataElementsAreEmpty_NothingGetsWrittenToOutput() { + + // given + val pin = "" + val tan = null + val dataElementGroup = BenutzerdefinierteSignatur(pin, tan) + + // when + val result = dataElementGroup.format() + + // then + assertThat(result).isEmpty() // ":" does not get written to output + } + +} \ No newline at end of file