diff --git a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinator.kt b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinator.kt index 8b53737d7a..a724f58fe4 100644 --- a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinator.kt +++ b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinator.kt @@ -9,6 +9,7 @@ import no.nav.familie.tidslinje.utvidelser.biFunksjon import no.nav.familie.tidslinje.utvidelser.kombinerMed import no.nav.familie.tidslinje.utvidelser.map import no.nav.familie.tidslinje.utvidelser.slåSammen +import no.nav.familie.tidslinje.utvidelser.trim /** * Extension-metode for å kombinere to tidslinjer der begge har verdi @@ -107,7 +108,7 @@ fun Tidslinje.kombinerKunVerdiMed( fun Tidslinje.erIkkeTom() = !this.erTom() -fun Tidslinje.harOverlappMed(tidslinje: Tidslinje) = this.kombinerUtenNullMed(tidslinje) { v, h -> true }.erIkkeTom() +fun Tidslinje.harOverlappMed(tidslinje: Tidslinje) = this.kombinerUtenNullMed(tidslinje) { v, h -> true }.trim(Null()).erIkkeTom() fun Tidslinje.harIkkeOverlappMed(tidslinje: Tidslinje) = !this.harOverlappMed(tidslinje) diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinatorTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinatorTest.kt new file mode 100644 index 0000000000..c4482e68c2 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/komposisjon/TidslinjeKombinatorTest.kt @@ -0,0 +1,120 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon + +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.feb +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.jan +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.tilCharTidslinje +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.tilStringTidslinje +import no.nav.familie.tidslinje.Tidslinje +import no.nav.familie.tidslinje.tomTidslinje +import no.nav.familie.tidslinje.utvidelser.tilPerioder +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class TidslinjeKombinatorTest { + /* + Dager: | 1. januar | 2. januar | 3. januar | 4. januar | 5. januar | + Tidslinje 1: | a | a | a | a | + Tidslinje 2: | b | b | b | + Tidslinje 3: | c | null | null | c | + */ + private val tidslinje1 = "aaaa".tilCharTidslinje(1.jan(2000)) + private val tidslinje2 = "bbb".tilCharTidslinje(3.jan(2000)) + private val tidslinje3 = "c c".tilCharTidslinje(1.jan(2000)) + + @Test + fun kombinerUtenNull() { + val faktisk = listOf(tidslinje1, tidslinje2, tidslinje3).kombinerUtenNull { it.joinToString("") } + val forventet = listOf("ac", "a", "ab", "abc", "b").tilStringTidslinje(1.jan(2000)) + + assertThat(faktisk).isEqualTo(forventet) + } + + @Test + fun kombinerUtenNullOgIkkeTom() { + val faktisk = listOf(tidslinje1, tidslinje2, tidslinje3).kombinerUtenNullOgIkkeTom { it.joinToString("") } + val forventet = listOf("ac", "a", "ab", "abc", "b").tilStringTidslinje(1.jan(2000)) + + assertThat(faktisk).isEqualTo(forventet) + } + + @Test + fun kombiner() { + val faktisk = listOf(tidslinje1, tidslinje2, tidslinje3).kombiner().tilPerioder() + + assertThat(faktisk.size).isEqualTo(5) + assertThat(faktisk[0].verdi).containsExactly('a', 'c') + assertThat(faktisk[1].verdi).containsExactly('a') + assertThat(faktisk[2].verdi).containsExactly('a', 'b') + assertThat(faktisk[3].verdi).containsExactly('a', 'b', 'c') + assertThat(faktisk[4].verdi).containsExactly('b') + } + + @Test + fun kombinerKunVerdiMedMap() { + val tidslinjeMap = mapOf("key1" to tidslinje1, "key2" to tidslinje2) + + val faktisk = + tidslinjeMap.kombinerKunVerdiMed(tidslinje3) { c1, c2 -> + c1.toString() + c2.toString() + } + + val forventet1 = listOf("ac", null, null, "ac").tilStringTidslinje(1.jan(2000)) + val forventet2 = listOf(null, null, null, "bc", null).tilStringTidslinje(1.jan(2000)) + + assertThat(faktisk["key1"]).isEqualTo(forventet1) + assertThat(faktisk["key2"]).isEqualTo(forventet2) + } + + @Test + fun kombinerKunVerdiMed() { + val faktisk = + tidslinje1.kombinerKunVerdiMed(tidslinje2, tidslinje3) { c1, c2, c3 -> + c1.toString() + c2.toString() + c3.toString() + } + + val forventet = listOf(null, null, null, "abc", null).tilStringTidslinje(1.jan(2000)) + + assertThat(faktisk).isEqualTo(forventet) + } + + @Test + fun erIkkeTom() { + assertThat(tomTidslinje().erIkkeTom()).isFalse() + assertThat("a".tilCharTidslinje(1.jan(2000)).erIkkeTom()).isTrue() + } + + @Test + fun harOverlappMed() { + assertThat(tidslinje1.harOverlappMed(tidslinje2)).isTrue() + + val tidslinjeUtenOverlappMedTidslinje1 = "a".tilCharTidslinje(1.feb(2000)) + assertThat(tidslinje1.harOverlappMed(tidslinjeUtenOverlappMedTidslinje1)).isFalse() + } + + @Test + fun harIkkeOverlappMed() { + assertThat(tidslinje1.harIkkeOverlappMed(tidslinje2)).isFalse() + + val tidslinjeUtenOverlappMedTidslinje1 = "a".tilCharTidslinje(1.feb(2000)) + assertThat(tidslinje1.harIkkeOverlappMed(tidslinjeUtenOverlappMedTidslinje1)).isTrue() + } + + @Test + fun `kombinerMedNullable skal returnere this hvis den andre tidslinjen er null`() { + val nullTidslinje: Tidslinje? = null + val faktisk = tidslinje1.kombinerMedNullable(nullTidslinje) { c1, c2 -> c1 } + assertThat(faktisk).isEqualTo(tidslinje1) + } + + @Test + fun kombinerMedNullable() { + val faktisk = + tidslinje1.kombinerMedNullable(tidslinje2) { c1, c2 -> + if (c1 == null || c2 == null) null else c1 + } + + val forventet = " aa ".tilCharTidslinje(1.jan(2000)) + + assertThat(faktisk).isEqualTo(forventet) + } +}