From 42fad1fbd66c24eccbd0889a6896dc865511c0ee Mon Sep 17 00:00:00 2001 From: ehellerslien <45560335+ehellerslien@users.noreply.github.com> Date: Mon, 23 Sep 2024 11:31:35 +0200 Subject: [PATCH] issue-978: Endrer fra Optional til T. (#46) (#48) * issue-978: Endrer fra Optional til T. --- pom.xml | 2 +- .../no/nav/system/rule/dsl/AbstractRuleset.kt | 22 ++++++++++-------- .../kotlin/no/nav/system/rule/dsl/Rule.kt | 19 +++++++-------- .../demo/ruleflow/BeregnAlderspensjonFlyt.kt | 6 ++--- .../ruleset/ListSubsumtionMedPatternRSTest.kt | 6 ++--- .../rule/dsl/demo/ruleset/NoReturnValueRS.kt | 10 ++++++++ .../dsl/demo/ruleset/NoReturnValueRSTest.kt | 15 ++++++++++++ .../rule/dsl/demo/ruleset/PatternRSTest.kt | 2 +- .../dsl/demo/ruleset/PatternRuleChainingRS.kt | 3 +-- .../demo/ruleset/PatternRuleChainingRSTest.kt | 19 +++++++-------- .../demo/ruleset/PersonenErFlyktningRSTest.kt | 23 +++++++++++-------- .../dsl/demo/ruleset/RuleChainingRSTest.kt | 4 ++-- 12 files changed, 81 insertions(+), 50 deletions(-) create mode 100644 src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRS.kt create mode 100644 src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRSTest.kt diff --git a/pom.xml b/pom.xml index d66e28e..b5adfb7 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ no.nav.system rule.dsl - 1.5.5 + 1.6.0 jar rule-dsl diff --git a/src/main/kotlin/no/nav/system/rule/dsl/AbstractRuleset.kt b/src/main/kotlin/no/nav/system/rule/dsl/AbstractRuleset.kt index 4769e09..598f6c1 100644 --- a/src/main/kotlin/no/nav/system/rule/dsl/AbstractRuleset.kt +++ b/src/main/kotlin/no/nav/system/rule/dsl/AbstractRuleset.kt @@ -8,9 +8,7 @@ import no.nav.system.rule.dsl.inspections.debug import no.nav.system.rule.dsl.pattern.Pattern import no.nav.system.rule.dsl.rettsregel.Faktum import no.nav.system.rule.dsl.rettsregel.ListSubsumtion -import no.nav.system.rule.dsl.inspections.trace import org.jetbrains.annotations.TestOnly -import java.util.* /** * Abstract Ruleset manages creation, ordering and execution of rules specified in implementing classes. @@ -40,7 +38,7 @@ abstract class AbstractRuleset : AbstractResourceAccessor() { * TODO Vurder om denne kan igjen bli private. Behovet for sporing at regelsett, og deretter uthenting av returverdien, er kanskje ikke lenger nødvendig. * (Det var PersonenErFlyktningRS som benyttet dette en gang). */ - var returnValue: T? = null + lateinit var returnValue: T /** * Creates a standard rule using the rule mini-DSL. @@ -102,12 +100,12 @@ abstract class AbstractRuleset : AbstractResourceAccessor() { } @TestOnly - open fun test(): Optional { + open fun test(): T { return internalRun() } @TestOnly - internal fun testAndDebug(): Optional { + internal fun testAndDebug(): T { val ret = internalRun() println(this.debug()) return ret @@ -118,7 +116,7 @@ abstract class AbstractRuleset : AbstractResourceAccessor() { * * @return value T wrapped in Optional */ - fun run(parent: AbstractRuleComponent): Optional { + fun run(parent: AbstractRuleComponent): T { if (parent is AbstractResourceAccessor) this.resourceMap = parent.resourceMap parent.children.add(this) @@ -129,7 +127,7 @@ abstract class AbstractRuleset : AbstractResourceAccessor() { * Creates, sorts and evaluates the rules of the ruleset. */ @Suppress("MemberVisibilityCanBePrivate") - protected fun internalRun(): Optional { + protected fun internalRun(): T { create() ruleFunctionMap.values.forEach { ruleSpawn -> @@ -137,12 +135,18 @@ abstract class AbstractRuleset : AbstractResourceAccessor() { it.resourceMap = this.resourceMap it.evaluate() if (it.returnRule) { - returnValue = it.returnValue.orElse(null) + returnValue = it.returnValue return it.returnValue } } } - return Optional.empty() + + /** + * Ruleset must be of type Unit if no rules have returned a value. + * If the ruleset is not of type Unit, a ClassCastException is thrown _when the value is used_. + */ + @Suppress("UNCHECKED_CAST") + return Unit as T } /** diff --git a/src/main/kotlin/no/nav/system/rule/dsl/Rule.kt b/src/main/kotlin/no/nav/system/rule/dsl/Rule.kt index d4701e9..e3671c4 100644 --- a/src/main/kotlin/no/nav/system/rule/dsl/Rule.kt +++ b/src/main/kotlin/no/nav/system/rule/dsl/Rule.kt @@ -1,11 +1,12 @@ package no.nav.system.rule.dsl import no.nav.system.rule.dsl.enums.RuleComponentType -import no.nav.system.rule.dsl.enums.RuleComponentType.* +import no.nav.system.rule.dsl.enums.RuleComponentType.REGEL import no.nav.system.rule.dsl.pattern.Pattern -import no.nav.system.rule.dsl.rettsregel.* +import no.nav.system.rule.dsl.rettsregel.AbstractSubsumtion +import no.nav.system.rule.dsl.rettsregel.Faktum +import no.nav.system.rule.dsl.rettsregel.erLik import no.nav.system.rule.dsl.rettsregel.helper.svarord -import java.util.* import kotlin.experimental.ExperimentalTypeInference /** @@ -68,7 +69,7 @@ open class Rule( /** * The value this rule will return. */ - internal var returnValue: Optional = Optional.empty() + internal lateinit var returnValue: T /** * Set to true if rule has a return value. When set to true this rule will stop ruleset evaluation if fired. @@ -142,13 +143,9 @@ open class Rule( /** * DSL: Return value entry. */ - fun RETURNER(returnValue: T? = null) { - if (returnValue == null) { - this.returnValue = Optional.empty() - } else { - this.returnValue = Optional.of(returnValue) - if (returnValue is Faktum<*>) returnValue.children.add(this) - } + fun RETURNER(returnValue: T) { + this.returnValue = returnValue + if (returnValue is Faktum<*>) returnValue.children.add(this) returnRule = true } diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleflow/BeregnAlderspensjonFlyt.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleflow/BeregnAlderspensjonFlyt.kt index 5307530..1635822 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleflow/BeregnAlderspensjonFlyt.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleflow/BeregnAlderspensjonFlyt.kt @@ -31,7 +31,7 @@ class BeregnAlderspensjonFlyt( Faktum("Kapittel 20", false), virkningstidspunkt, Faktum("Søknadstidspunkt fom 2021", true) - ).run(this).get() + ).run(this) /** * Task: Beregn Trygdetid @@ -41,7 +41,7 @@ class BeregnAlderspensjonFlyt( virkningstidspunkt, person.boperioder, flyktningUtfall - ).run(this).get() + ).run(this) forgrening("Sivilstand gift?") { gren { @@ -71,7 +71,7 @@ class BeregnAlderspensjonFlyt( grunnbeløpByDate(virkningstidspunkt.value), output.anvendtTrygdetid!!.år, grunnpensjonSats - ).run(this).get() + ).run(this) output } diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/ListSubsumtionMedPatternRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/ListSubsumtionMedPatternRSTest.kt index 0b1ad02..09a8d96 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/ListSubsumtionMedPatternRSTest.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/ListSubsumtionMedPatternRSTest.kt @@ -19,7 +19,7 @@ class ListSubsumtionMedPatternRSTest { Faktum("bool4", false) ) - val rule = ListSubsumtionMedPatternRS(faktumListe).test().get() + val rule = ListSubsumtionMedPatternRS(faktumListe).test() assertTrue(rule.fired()) val ingenSubsumsjon = rule.children.first() as ListSubsumtion @@ -39,7 +39,7 @@ class ListSubsumtionMedPatternRSTest { Faktum("bool4", true) ) - val regel = ListSubsumtionMedPatternRS(faktumListe).test().get() + val regel = ListSubsumtionMedPatternRS(faktumListe).test() assertTrue(regel.fired()) val minstEnSubsumsjon = regel.children.first() as ListSubsumtion @@ -58,7 +58,7 @@ class ListSubsumtionMedPatternRSTest { Faktum("bool4", true) ) - val regel = ListSubsumtionMedPatternRS(faktumListe).test().get() + val regel = ListSubsumtionMedPatternRS(faktumListe).test() assertTrue(regel.fired()) val alleSubsumsjon = regel.children.first() as ListSubsumtion diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRS.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRS.kt new file mode 100644 index 0000000..6a7ad50 --- /dev/null +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRS.kt @@ -0,0 +1,10 @@ +package no.nav.system.rule.dsl.demo.ruleset + +import no.nav.system.rule.dsl.AbstractRuleset + +/** + * Regelsett med type Int uten returnverdi er ugyldig. + */ +class NoReturnValueRS : AbstractRuleset() { + override fun create() {} +} diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRSTest.kt new file mode 100644 index 0000000..e322cf3 --- /dev/null +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/NoReturnValueRSTest.kt @@ -0,0 +1,15 @@ +package no.nav.system.rule.dsl.demo.ruleset + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + + +class NoReturnValueRSTest { + + @Test + fun `test hvor førstRegel kjører`() { + assertThrows { + NoReturnValueRS().test() + 1 + } + } +} diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRSTest.kt index 9301b05..b762221 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRSTest.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRSTest.kt @@ -8,7 +8,7 @@ class PatternRSTest { fun `skal returnere korrekt sum`() { val list1 = mutableListOf(2, 4, 6, 8, 10) val list2 = mutableListOf(1, 3, 5, 7, 9) - val sum = PatternRS(list1, list2).test().get() + val sum = PatternRS(list1, list2).test() assertEquals(110, sum) } diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRS.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRS.kt index 83ed5cd..9538a3b 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRS.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRS.kt @@ -8,8 +8,7 @@ import no.nav.system.rule.dsl.pattern.createPattern * Test that should demonstrate rulechaining. * Rulechaining refers to having rules check if previous rules have fired, example [endreInntekt.harTruffet()] */ -class PatternRuleChainingRS(innInntektListe: List) : - AbstractRuleset() { +class PatternRuleChainingRS(innInntektListe: List) : AbstractRuleset() { private var noenInntektEtterUforhet = innInntektListe.createPattern() diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRSTest.kt index bd4ff76..6330ce5 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRSTest.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PatternRuleChainingRSTest.kt @@ -13,29 +13,30 @@ class PatternRuleChainingRSTest { @Test fun `skal endre beløp for siste innslag i inntektslisten og returnere true`() { val inntektsListe = listOf(Inntekt(10), Inntekt(15), Inntekt(20)) - val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test().get() + val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test() assertTrue(patternRuleChainingRS) - assertEquals(10,inntektsListe[0].beløp) - assertEquals(15,inntektsListe[1].beløp) - assertEquals(25,inntektsListe[2].beløp) + assertEquals(10, inntektsListe[0].beløp) + assertEquals(15, inntektsListe[1].beløp) + assertEquals(25, inntektsListe[2].beløp) } @Test fun `skal ikke endre noen innslag i inntektslisten og returnere false`() { val inntektsListe = listOf(Inntekt(5), Inntekt(10), Inntekt(15)) - val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test().get() + val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test() +// val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test().get() assertFalse(patternRuleChainingRS) - assertEquals(5,inntektsListe[0].beløp) - assertEquals(10,inntektsListe[1].beløp) - assertEquals(15,inntektsListe[2].beløp) + assertEquals(5, inntektsListe[0].beløp) + assertEquals(10, inntektsListe[1].beløp) + assertEquals(15, inntektsListe[2].beløp) } @Test fun `skal ikke krasje dersom listen er tom`() { val inntektsListe = listOf() - val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test().get() + val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test() assertFalse(patternRuleChainingRS) } diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PersonenErFlyktningRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PersonenErFlyktningRSTest.kt index 05c11b6..f936109 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PersonenErFlyktningRSTest.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/PersonenErFlyktningRSTest.kt @@ -1,11 +1,14 @@ package no.nav.system.rule.dsl.demo.ruleset -import no.nav.system.rule.dsl.demo.domain.* +import no.nav.system.rule.dsl.demo.domain.ForsteVirkningsdatoGrunnlag +import no.nav.system.rule.dsl.demo.domain.InngangOgEksportgrunnlag +import no.nav.system.rule.dsl.demo.domain.Person +import no.nav.system.rule.dsl.demo.domain.Trygdetid +import no.nav.system.rule.dsl.demo.domain.koder.UtfallType.* import no.nav.system.rule.dsl.demo.domain.koder.YtelseEnum import no.nav.system.rule.dsl.demo.helper.localDate import no.nav.system.rule.dsl.enums.ListComparator.INGEN import no.nav.system.rule.dsl.enums.ListComparator.MINST_EN_AV -import no.nav.system.rule.dsl.demo.domain.koder.UtfallType.* import no.nav.system.rule.dsl.rettsregel.Faktum import no.nav.system.rule.dsl.rettsregel.ListSubsumtion import org.junit.jupiter.api.Assertions.* @@ -28,7 +31,7 @@ class PersonenErFlyktningRSTest { Faktum("HarKravlinjeFremsattDatoFom2021", true) ).run { test() - this.returnValue!! + this.returnValue } assertEquals(IKKE_RELEVANT, flyktningUtfall.value) @@ -46,7 +49,7 @@ class PersonenErFlyktningRSTest { flyktning = Faktum("Angitt flyktning", true), ) - val flyktningUtfall = PersonenErFlyktningRS( + val flyktningUtfall = PersonenErFlyktningRS( person, Faktum("Ytelsestype", YtelseEnum.AP), Faktum("Kapittel20", false), @@ -54,7 +57,7 @@ class PersonenErFlyktningRSTest { Faktum("HarKravlinjeFremsattDatoFom2021", false) ).run { test() - this.returnValue!! + this.returnValue } assertEquals(OPPFYLT, flyktningUtfall.value) @@ -66,7 +69,9 @@ class PersonenErFlyktningRSTest { fun testErIkkeFlyktning_virkFom2021_ikkeOvergang() { val person = Person( fødselsdato = Faktum("Fødselsdato", localDate(1980, 1, 1)), - inngangOgEksportgrunnlag = InngangOgEksportgrunnlag().apply { unntakFraForutgaendeMedlemskap.unntak.value = true } + inngangOgEksportgrunnlag = InngangOgEksportgrunnlag().apply { + unntakFraForutgaendeMedlemskap.unntak.value = true + } ) val flyktningUtfall = PersonenErFlyktningRS( @@ -77,7 +82,7 @@ class PersonenErFlyktningRSTest { Faktum("HarKravlinjeFremsattDatoFom2021", true) ).run { test() - this.returnValue!! + this.returnValue } val regelOvergangsregelAP = flyktningUtfall.children[0].children[2].children[0] @@ -104,7 +109,7 @@ class PersonenErFlyktningRSTest { Faktum("HarKravlinjeFremsattDatoFom2021", true) ).run { test() - this.returnValue!! + this.returnValue } assertEquals(OPPFYLT, flyktningUtfall.value) @@ -140,7 +145,7 @@ class PersonenErFlyktningRSTest { Faktum("HarKravlinjeFremsattDatoFom2021", true) ).run { test() - this.returnValue!! + this.returnValue } assertEquals(OPPFYLT, flyktningUtfall.value) diff --git a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/RuleChainingRSTest.kt b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/RuleChainingRSTest.kt index e38d0cc..9c05f51 100644 --- a/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/RuleChainingRSTest.kt +++ b/src/test/kotlin/no/nav/system/rule/dsl/demo/ruleset/RuleChainingRSTest.kt @@ -10,13 +10,13 @@ class RuleChainingRSTest { @Test fun `test hvor førstRegel kjører`() { - val ruleChainingRS = RuleChainingRS(true).test().get() + val ruleChainingRS = RuleChainingRS(true).test() assertEquals(1003, ruleChainingRS) } @Test fun `test hvor førsteRegel ikke kjører`() { - val ruleChainingRS = RuleChainingRS(false).test().get() + val ruleChainingRS = RuleChainingRS(false).test() assertEquals(999, ruleChainingRS) }