diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/TidslinjeKombinasjonTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/TidslinjeKombinasjonTest.kt new file mode 100644 index 0000000000..348b069038 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/TidslinjeKombinasjonTest.kt @@ -0,0 +1,87 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles + +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.utvidelser.kombinerMed +import no.nav.familie.tidslinje.utvidelser.tilPerioder +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test + +class TidslinjeKombinasjonTest { + private val kombinator = { venstre: Char?, høyre: Char? -> + (venstre?.toString() ?: "").trim() + (høyre?.toString() ?: "").trim() + } + + @Test + fun testEndeligeLikeLangTidslinjer() { + assertTidslinjer( + linje1 = "abcdef", + linje2 = "fedcba", + "af", + "be", + "cd", + "dc", + "eb", + "fa", + ) + } + + @Test + fun testEndeligeTidslinjerMedForskjelligLengde() { + assertTidslinjer( + linje1 = " ab", + linje2 = "fedcba", + "f", + "e", + "ad", + "bc", + "b", + "a", + ) + } + + @Test + fun testUendeligeTidslinjerFremover() { + assertTidslinjer( + linje1 = "abc>", + linje2 = "abacd>", + "aa", + "bb", + "ca", + "cc", + "cd", + ">", + ) + } + + @Test + fun testUendeligeTidslinjerBeggeVeier() { + assertTidslinjer( + linje1 = "", + ) + } + + private fun assertTidslinjer( + linje1: String, + linje2: String, + vararg forventet: String, + ) { + val fom = jan(2020) + val char1 = linje1.tilCharTidslinje(fom) + val char2 = linje2.tilCharTidslinje(fom) + + val kombinertePerioder = char1.kombinerMed(char2, kombinator).tilPerioder() + val forventedePerioder = forventet.toList().tilStringTidslinje(fom).tilPerioder() + + Assertions.assertEquals(forventedePerioder, kombinertePerioder) + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/Beskj\303\246reTidslinjeTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/Beskj\303\246reTidslinjeTest.kt" new file mode 100644 index 0000000000..0c64a35f1b --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/Beskj\303\246reTidslinjeTest.kt" @@ -0,0 +1,135 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon + +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.apr +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.des +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.feb +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.mar +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.tilCharTidslinje +import no.nav.familie.tidslinje.TidsEnhet.MÅNED +import no.nav.familie.tidslinje.beskjærEtter +import no.nav.familie.tidslinje.tomTidslinje +import no.nav.familie.tidslinje.utvidelser.tilPerioder +import org.junit.Assert.assertEquals +import org.junit.jupiter.api.Test + +internal class BeskjæreTidslinjeTest { + @Test + fun `skal beskjære endelig tidslinje på begge sider`() { + val hovedlinje = "aaaaaa".tilCharTidslinje(des(2001)) + val beskjæring = "bbb".tilCharTidslinje(feb(2002)) + + val faktiskePerioder = hovedlinje.beskjærEtter(beskjæring).tilPerioder() + val forventedePerioder = "aaa".tilCharTidslinje(feb(2002)).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } + + @Test + fun `skal beholde tidslinje som allerede er innenfor beskjæring`() { + val hovedlinje = "aaa".tilCharTidslinje(feb(2002)) + val beskjæring = "bbbbbbbbb".tilCharTidslinje(des(2001)) + + val faktiskePerioder = hovedlinje.beskjærEtter(beskjæring).tilPerioder() + val forventedePerioder = "aaa".tilCharTidslinje(feb(2002)).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } + + @Test + fun `skal beholde tidslinje som er innenfor en uendelig beskjæring`() { + val hovedlinje = "aaa".tilCharTidslinje(feb(2002)) + val beskjæring = "".tilCharTidslinje(mar(2002)) + + val faktiskePerioder = hovedlinje.beskjærEtter(beskjæring).tilPerioder() + val forventedePerioder = "aaa".tilCharTidslinje(feb(2002)).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } + + @Test + fun `beskjæring utenfor tidslinjen skal gi tom tidslinje`() { + val hovedlinje = "aaaaaa".tilCharTidslinje(des(2001)) + val beskjæring = "bbb".tilCharTidslinje(feb(2009)) + + val faktiskePerioder = hovedlinje.beskjærEtter(beskjæring).tilPerioder() + val forventedePerioder = tomTidslinje(beskjæring.startsTidspunkt, MÅNED).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } + + @Test + fun `skal beskjære uendelig tidslinje begge veier mot endelig tidsline`() { + val hovedlinje = "".tilCharTidslinje(des(2002)) + val beskjæring = "bbb".tilCharTidslinje(feb(2002)) + + val faktiskePerioder = hovedlinje.beskjærEtter(beskjæring).tilPerioder() + val forventedePerioder = "aaa".tilCharTidslinje(feb(2002)).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } + + @Test + fun `skal beskjære tidslinje som går fra uendelig lenge siden til et endelig tidspunkt i fremtiden`() { + val hovedlinje = "()).tilPerioder() + val forventedePerioder = tomTidslinje(tidsEnhet = MÅNED).tilPerioder() + + assertEquals(forventedePerioder, faktiskePerioder) + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/MapTidslinjeTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/MapTidslinjeTest.kt new file mode 100644 index 0000000000..bc1768e116 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/MapTidslinjeTest.kt @@ -0,0 +1,87 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon + +import no.nav.familie.ba.sak.kjerne.tidslinje.Periode +import no.nav.familie.ba.sak.kjerne.tidslinje.fraOgMed +import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.Innhold +import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.innholdForTidspunkt +import no.nav.familie.ba.sak.kjerne.tidslinje.tidslinje +import no.nav.familie.ba.sak.kjerne.tidslinje.tidsrom.rangeTo +import no.nav.familie.ba.sak.kjerne.tidslinje.tilOgMed +import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.map +import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.mapIkkeNull +import no.nav.familie.ba.sak.kjerne.tidslinje.util.apr +import no.nav.familie.ba.sak.kjerne.tidslinje.util.aug +import no.nav.familie.ba.sak.kjerne.tidslinje.util.des +import no.nav.familie.ba.sak.kjerne.tidslinje.util.feb +import no.nav.familie.ba.sak.kjerne.tidslinje.util.jan +import no.nav.familie.ba.sak.kjerne.tidslinje.util.jul +import no.nav.familie.ba.sak.kjerne.tidslinje.util.jun +import no.nav.familie.ba.sak.kjerne.tidslinje.util.mai +import no.nav.familie.ba.sak.kjerne.tidslinje.util.mar +import no.nav.familie.ba.sak.kjerne.tidslinje.util.nov +import no.nav.familie.ba.sak.kjerne.tidslinje.util.okt +import no.nav.familie.ba.sak.kjerne.tidslinje.util.sep +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +internal class MapTidslinjeTest { + val tidslinje = + tidslinje { + listOf( + Periode(aug(2019), nov(2019), null), + Periode(jan(2020), mar(2020), "A"), + Periode(apr(2020), jun(2020), null), + Periode(jul(2020), aug(2020), "B"), + Periode(mar(2021), okt(2021), "C"), + Periode(jan(2022), mai(2022), null), + ) + } + + @Test + fun `skal mappe innhold og ivareta null`() { + val faktisk = tidslinje.map { it?.lowercase() } + + val forventet = + tidslinje { + listOf( + Periode(aug(2019), nov(2019), null), + Periode(jan(2020), mar(2020), "a"), + Periode(apr(2020), jun(2020), null), + Periode(jul(2020), aug(2020), "b"), + Periode(mar(2021), okt(2021), "c"), + Periode(jan(2022), mai(2022), null), + ) + } + + assertEquals(forventet, faktisk) + assertEquals(aug(2019), faktisk.fraOgMed()) + assertEquals(mai(2022), faktisk.tilOgMed()) + } + + @Test + fun `skal mappe innhold og fjerne null`() { + val faktisk = tidslinje.mapIkkeNull { it.lowercase() } + + val forventet = + tidslinje { + listOf( + Periode(jan(2020), mar(2020), "a"), + Periode(jul(2020), aug(2020), "b"), + Periode(mar(2021), okt(2021), "c"), + ) + } + + assertEquals(forventet, faktisk) + assertEquals(jan(2020), faktisk.fraOgMed()) + assertEquals(okt(2021), faktisk.tilOgMed()) + + ( + (aug(2019)..des(2019)) + .plus(apr(2020)..jun(2020)) + .plus(sep(2020)..feb(2021)) + .plus(nov(2021)..mai(2022)) + ).forEach { + assertEquals(Innhold.utenInnhold(), faktisk.innholdForTidspunkt(it)) + } + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/M\303\245nedFraM\303\245nedsskifteTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/M\303\245nedFraM\303\245nedsskifteTest.kt" new file mode 100644 index 0000000000..125ddb4a9e --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/M\303\245nedFraM\303\245nedsskifteTest.kt" @@ -0,0 +1,85 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon + +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.des +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.nov +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.tilCharTidslinje +import no.nav.familie.tidslinje.TidsEnhet +import no.nav.familie.tidslinje.tomTidslinje +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +internal class MånedFraMånedsskifteTest { + @Test + fun `skal gi tom tidslinje hvis alle dager er inni én måned`() { + val dagTidslinje = "aaaaaa".tilCharTidslinje(7.des(2021)) + val månedTidslinje = dagTidslinje.tilMånedFraMånedsskifteIkkeNull { _, _ -> 'b' } + + val forventet = tomTidslinje(1.jan(2022), tidsEnhet = TidsEnhet.MÅNED) + + assertEquals(forventet, månedTidslinje) + } + + @Test + fun `skal gi én måned ved ett månedsskifte`() { + val dagTidslinje = "abcdefg".tilCharTidslinje(28.nov(2021)) + val månedTidslinje = + dagTidslinje + .tilMånedFraMånedsskifteIkkeNull { _, verdiFørsteDagDenneMåned -> + verdiFørsteDagDenneMåned + } + + assertEquals("d".tilCharTidslinje(des(2021)), månedTidslinje) + } + + @Test + fun `skal gi to måneder ved to månedsskifter`() { + val dagTidslinje = "abcdefghijklmnopqrstuvwxyzæøå0123456789".tilCharTidslinje(28.nov(2021)) + val månedTidslinje = + dagTidslinje + .tilMånedFraMånedsskifteIkkeNull { verdiSisteDagForrigeMåned, _ -> + verdiSisteDagForrigeMåned + } + + assertEquals("c4".tilCharTidslinje(des(2021)), månedTidslinje) + } + + @Test + fun `skal gi tom tidslinje hvis månedsskiftet mangler verdi på begge sider`() { + val dagTidslinje = + "abcdefghijklmnopqrstuvwxyzæøå0123456789" + .tilCharTidslinje(28.nov(2021)) + .mapIkkeNull { + when (it) { + 'c', 'd', '4', '5' -> null // 30/11, 1/12, 31/12 og 1/1 mangler verdi + else -> it + } + } + + val månedTidslinje = dagTidslinje.tilMånedFraMånedsskifteIkkeNull { _, _ -> 'A' } + + val forventet = tomTidslinje(1.feb(2022), tidsEnhet = TidsEnhet.MÅNED) + + assertEquals(forventet, månedTidslinje) + } + + @Test + fun `skal gi tom tidslinje hvis månedsskiftet mangler verdi på én av sidene`() { + val dagTidslinje = + "abcdefghijklmnopqrstuvwxyzæøå0123456789" + .tilCharTidslinje(28.nov(2021)) + .mapIkkeNull { + when (it) { + 'c', '5' -> null // 30/11 og 1/1 mangler verdi + else -> it + } + } + + val månedTidslinje = dagTidslinje.tilMånedFraMånedsskifteIkkeNull { _, _ -> 'A' } + + val forventet = tomTidslinje(1.feb(2022), tidsEnhet = TidsEnhet.MÅNED) + + assertEquals(forventet, månedTidslinje) + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/ZipTidslinjeTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/ZipTidslinjeTest.kt new file mode 100644 index 0000000000..d57bea0a60 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/transformasjon/ZipTidslinjeTest.kt @@ -0,0 +1,22 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon + +import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util.tilCharTidslinje +import no.nav.familie.tidslinje.utvidelser.tilPerioder +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.time.YearMonth + +class ZipTidslinjeTest { + @Test + fun testZipMedNesteTidslinje() { + val aTilF = ('a'..'f').toList().joinToString("") + val bokstavTidslinje = aTilF.tilCharTidslinje(YearMonth.now()) + val bokstavParTidslinje = bokstavTidslinje.zipMedNeste(ZipPadding.FØR) + + assertThat(aTilF).isEqualTo("abcdef") + + assertThat(bokstavParTidslinje.tilPerioder().map { it.verdi }).isEqualTo( + listOf(Pair(null, 'a'), Pair('a', 'b'), Pair('b', 'c'), Pair('c', 'd'), Pair('d', 'e'), Pair('e', 'f')), + ) + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/BooleanCharTidslinje.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/BooleanCharTidslinje.kt new file mode 100644 index 0000000000..6d176c9bec --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/BooleanCharTidslinje.kt @@ -0,0 +1,16 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util + +import no.nav.familie.tidslinje.Tidslinje +import no.nav.familie.tidslinje.mapVerdi +import java.time.YearMonth + +fun String.somBoolskTidslinje(startTidspunkt: YearMonth) = this.tilCharTidslinje(startTidspunkt).somBoolsk() + +fun Tidslinje.somBoolsk() = + this.mapVerdi { + when (it?.lowercaseChar()) { + 't' -> true + 'f' -> false + else -> null + } + } diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinje.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinje.kt new file mode 100644 index 0000000000..ada99ba13c --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinje.kt @@ -0,0 +1,43 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util + +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned +import no.nav.familie.tidslinje.Periode +import no.nav.familie.tidslinje.Tidslinje +import no.nav.familie.tidslinje.tilTidslinje +import no.nav.familie.tidslinje.utvidelser.konverterTilMåned +import java.time.LocalDate +import java.time.YearMonth + +fun String.tilCharTidslinje(startTidspunkt: LocalDate): Tidslinje { + val erUendeligLengeSiden = firstOrNull() == '<' + val erUendeligLengeTil = lastOrNull() == '>' + val sisteIndeks = filter { it !in "<>" }.lastIndex + return this + .filter { it !in "<>" } + .mapIndexed { index, c -> + Periode( + verdi = c, + fom = if (index == 0 && erUendeligLengeSiden) null else startTidspunkt.plusDays(index.toLong()), + tom = if (index == sisteIndeks && erUendeligLengeTil) null else startTidspunkt.plusDays(index.toLong()), + ) + }.tilTidslinje() +} + +fun String.tilCharTidslinje(startTidspunkt: YearMonth): Tidslinje { + val erUendeligLengeSiden = firstOrNull() == '<' + val erUendeligLengeTil = lastOrNull() == '>' + val sisteIndeks = filter { it !in "<>" }.lastIndex + return this + .filter { it !in "<>" } + .mapIndexed { index, c -> + Periode( + verdi = c, + fom = if (index == 0 && erUendeligLengeSiden) null else startTidspunkt.plusMonths(index.toLong()).førsteDagIInneværendeMåned(), + tom = if (index == sisteIndeks && erUendeligLengeTil) null else startTidspunkt.plusMonths(index.toLong()).sisteDagIInneværendeMåned(), + ) + }.tilTidslinje() + .konverterTilMåned { _, månedListe -> + månedListe.first().first().periodeVerdi + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinjeTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinjeTest.kt new file mode 100644 index 0000000000..f8a6ab1118 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/CharTidslinjeTest.kt @@ -0,0 +1,56 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util + +import no.nav.familie.ba.sak.common.rangeTo +import no.nav.familie.tidslinje.PRAKTISK_TIDLIGSTE_DAG +import no.nav.familie.tidslinje.utvidelser.tilPerioder +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.Test + +class CharTidslinjeTest { + @Test + fun testEnkelCharTidsline() { + val tegn = "---------------" + val charTidslinje = tegn.tilCharTidslinje(jan(2020)) + + assertEquals(1.jan(2020), charTidslinje.startsTidspunkt) + assertEquals(tegn.length, charTidslinje.innhold.sumOf { it.lengde }) + + val periode = charTidslinje.tilPerioder().single() + + assertEquals(1.jan(2020), periode.fom) + assertEquals(31.mar(2021), periode.tom) + assertEquals('-', periode.verdi) + } + + @Test + fun testUendeligCharTidslinje() { + val tegn = "<--->" + val charTidslinje = tegn.tilCharTidslinje(jan(2020)) + + assertEquals(PRAKTISK_TIDLIGSTE_DAG, charTidslinje.startsTidspunkt) + + val periode = charTidslinje.tilPerioder().single() + + assertNull(periode.fom) + assertNull(periode.tom) + assertEquals('-', periode.verdi) + } + + @Test + fun testSammensattTidsline() { + val tegn = "aabbbbcdddddda" + val charTidslinje = tegn.tilCharTidslinje(jan(2020)) + + assertEquals(1.jan(2020), charTidslinje.startsTidspunkt) + assertEquals(tegn.length, charTidslinje.innhold.sumOf { it.lengde }) + + val perioder = charTidslinje.tilPerioder() + assertEquals(5, perioder.size) + assertEquals((jan(2020)..feb(2020)).med('a'), perioder[0]) + assertEquals((mar(2020)..jun(2020)).med('b'), perioder[1]) + assertEquals((jul(2020)..jul(2020)).med('c'), perioder[2]) + assertEquals((aug(2020)..jan(2021)).med('d'), perioder[3]) + assertEquals((feb(2021)..feb(2021)).med('a'), perioder[4]) + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/StringTidslinje.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/StringTidslinje.kt new file mode 100644 index 0000000000..fb11cca2ac --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/StringTidslinje.kt @@ -0,0 +1,45 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util + +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned +import no.nav.familie.tidslinje.Periode +import no.nav.familie.tidslinje.Tidslinje +import no.nav.familie.tidslinje.tilTidslinje +import no.nav.familie.tidslinje.utvidelser.konverterTilMåned +import java.time.LocalDate +import java.time.YearMonth + +fun List.tilStringTidslinje(startTidspunkt: LocalDate): Tidslinje { + val erUendeligLengeSiden = firstOrNull() == "<" + val erUendeligLengeTil = lastOrNull() == ">" + val sisteIndeks = filter { it !in "<>" }.lastIndex + + return this + .filter { it !in "<>" } + .mapIndexed { index, s -> + Periode( + verdi = s, + fom = if (index == 0 && erUendeligLengeSiden) null else startTidspunkt.plusDays(index.toLong()), + tom = if (index == sisteIndeks && erUendeligLengeTil) null else startTidspunkt.plusDays(index.toLong()), + ) + }.tilTidslinje() +} + +fun List.tilStringTidslinje(startTidspunkt: YearMonth): Tidslinje { + val erUendeligLengeSiden = firstOrNull() == "<" + val erUendeligLengeTil = lastOrNull() == ">" + val sisteIndeks = filter { it !in "<>" }.lastIndex + + return this + .filter { it !in "<>" } + .mapIndexed { index, s -> + Periode( + verdi = s, + fom = if (index == 0 && erUendeligLengeSiden) null else startTidspunkt.plusMonths(index.toLong()).førsteDagIInneværendeMåned(), + tom = if (index == sisteIndeks && erUendeligLengeTil) null else startTidspunkt.plusMonths(index.toLong()).sisteDagIInneværendeMåned(), + ) + }.tilTidslinje() + .konverterTilMåned { _, månedListe -> + månedListe.first().first().periodeVerdi + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/Tid.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/Tid.kt new file mode 100644 index 0000000000..9ee68e5c9e --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/tidslinjefamiliefelles/util/Tid.kt @@ -0,0 +1,58 @@ +package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.util + +import no.nav.familie.ba.sak.common.YearMonthProgression +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned +import no.nav.familie.tidslinje.Periode +import java.time.LocalDate +import java.time.YearMonth + +fun jan(år: Int) = YearMonth.of(år, 1) + +fun feb(år: Int) = YearMonth.of(år, 2) + +fun mar(år: Int) = YearMonth.of(år, 3) + +fun apr(år: Int) = YearMonth.of(år, 4) + +fun mai(år: Int) = YearMonth.of(år, 5) + +fun jun(år: Int) = YearMonth.of(år, 6) + +fun jul(år: Int) = YearMonth.of(år, 7) + +fun aug(år: Int) = YearMonth.of(år, 8) + +fun sep(år: Int) = YearMonth.of(år, 9) + +fun okt(år: Int) = YearMonth.of(år, 10) + +fun nov(år: Int) = YearMonth.of(år, 11) + +fun des(år: Int) = YearMonth.of(år, 12) + +fun Int.jan(år: Int) = LocalDate.of(år, 1, this) + +fun Int.feb(år: Int) = LocalDate.of(år, 2, this) + +fun Int.mar(år: Int) = LocalDate.of(år, 3, this) + +fun Int.apr(år: Int) = LocalDate.of(år, 4, this) + +fun Int.mai(år: Int) = LocalDate.of(år, 5, this) + +fun Int.jun(år: Int) = LocalDate.of(år, 5, this) + +fun Int.jul(år: Int) = LocalDate.of(år, 5, this) + +fun Int.aug(år: Int) = LocalDate.of(år, 5, this) + +fun Int.sep(år: Int) = LocalDate.of(år, 5, this) + +fun Int.okt(år: Int) = LocalDate.of(år, 5, this) + +fun Int.nov(år: Int) = LocalDate.of(år, 11, this) + +fun Int.des(år: Int) = LocalDate.of(år, 12, this) + +fun YearMonthProgression.med(verdi: V) = Periode(verdi, this.start.førsteDagIInneværendeMåned(), this.endInclusive.sisteDagIInneværendeMåned())