Skip to content

Commit

Permalink
Feature/issue 978 (#47)
Browse files Browse the repository at this point in the history
* issue-978: Endrer fra Optional<T> til T.
  • Loading branch information
ehellerslien authored Sep 20, 2024
1 parent 44f54bb commit 1c1b447
Show file tree
Hide file tree
Showing 12 changed files with 81 additions and 50 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>no.nav.system</groupId>
<artifactId>rule.dsl</artifactId>
<version>1.5.5</version>
<version>1.6.0</version>
<packaging>jar</packaging>
<name>rule-dsl</name>

Expand Down
22 changes: 13 additions & 9 deletions src/main/kotlin/no/nav/system/rule/dsl/AbstractRuleset.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -40,7 +38,7 @@ abstract class AbstractRuleset<T : Any> : 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.
Expand Down Expand Up @@ -102,12 +100,12 @@ abstract class AbstractRuleset<T : Any> : AbstractResourceAccessor() {
}

@TestOnly
open fun test(): Optional<T> {
open fun test(): T {
return internalRun()
}

@TestOnly
internal fun testAndDebug(): Optional<T> {
internal fun testAndDebug(): T {
val ret = internalRun()
println(this.debug())
return ret
Expand All @@ -118,7 +116,7 @@ abstract class AbstractRuleset<T : Any> : AbstractResourceAccessor() {
*
* @return value T wrapped in Optional
*/
fun run(parent: AbstractRuleComponent): Optional<T> {
fun run(parent: AbstractRuleComponent): T {
if (parent is AbstractResourceAccessor) this.resourceMap = parent.resourceMap
parent.children.add(this)

Expand All @@ -129,20 +127,26 @@ abstract class AbstractRuleset<T : Any> : AbstractResourceAccessor() {
* Creates, sorts and evaluates the rules of the ruleset.
*/
@Suppress("MemberVisibilityCanBePrivate")
protected fun internalRun(): Optional<T> {
protected fun internalRun(): T {
create()

ruleFunctionMap.values.forEach { ruleSpawn ->
ruleSpawn.invoke().forEach {
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
}

/**
Expand Down
19 changes: 8 additions & 11 deletions src/main/kotlin/no/nav/system/rule/dsl/Rule.kt
Original file line number Diff line number Diff line change
@@ -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

/**
Expand Down Expand Up @@ -68,7 +69,7 @@ open class Rule<T : Any>(
/**
* The value this rule will return.
*/
internal var returnValue: Optional<T> = 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.
Expand Down Expand Up @@ -142,13 +143,9 @@ open class Rule<T : Any>(
/**
* 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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -41,7 +41,7 @@ class BeregnAlderspensjonFlyt(
virkningstidspunkt,
person.boperioder,
flyktningUtfall
).run(this).get()
).run(this)

forgrening("Sivilstand gift?") {
gren {
Expand Down Expand Up @@ -71,7 +71,7 @@ class BeregnAlderspensjonFlyt(
grunnbeløpByDate(virkningstidspunkt.value),
output.anvendtTrygdetid!!.år,
grunnpensjonSats
).run(this).get()
).run(this)

output
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Int>() {
override fun create() {}
}
Original file line number Diff line number Diff line change
@@ -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<ClassCastException> {
NoReturnValueRS().test() + 1
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Inntekt>) :
AbstractRuleset<Boolean>() {
class PatternRuleChainingRS(innInntektListe: List<Inntekt>) : AbstractRuleset<Boolean>() {

private var noenInntektEtterUforhet = innInntektListe.createPattern()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Inntekt>()
val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test().get()
val patternRuleChainingRS = PatternRuleChainingRS(inntektsListe).test()

assertFalse(patternRuleChainingRS)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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.*
Expand All @@ -28,7 +31,7 @@ class PersonenErFlyktningRSTest {
Faktum("HarKravlinjeFremsattDatoFom2021", true)
).run {
test()
this.returnValue!!
this.returnValue
}

assertEquals(IKKE_RELEVANT, flyktningUtfall.value)
Expand All @@ -46,15 +49,15 @@ class PersonenErFlyktningRSTest {
flyktning = Faktum("Angitt flyktning", true),
)

val flyktningUtfall = PersonenErFlyktningRS(
val flyktningUtfall = PersonenErFlyktningRS(
person,
Faktum("Ytelsestype", YtelseEnum.AP),
Faktum("Kapittel20", false),
Faktum("Virkningstidspunkt", localDate(2020, 1, 1)),
Faktum("HarKravlinjeFremsattDatoFom2021", false)
).run {
test()
this.returnValue!!
this.returnValue
}

assertEquals(OPPFYLT, flyktningUtfall.value)
Expand All @@ -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(
Expand All @@ -77,7 +82,7 @@ class PersonenErFlyktningRSTest {
Faktum("HarKravlinjeFremsattDatoFom2021", true)
).run {
test()
this.returnValue!!
this.returnValue
}

val regelOvergangsregelAP = flyktningUtfall.children[0].children[2].children[0]
Expand All @@ -104,7 +109,7 @@ class PersonenErFlyktningRSTest {
Faktum("HarKravlinjeFremsattDatoFom2021", true)
).run {
test()
this.returnValue!!
this.returnValue
}

assertEquals(OPPFYLT, flyktningUtfall.value)
Expand Down Expand Up @@ -140,7 +145,7 @@ class PersonenErFlyktningRSTest {
Faktum("HarKravlinjeFremsattDatoFom2021", true)
).run {
test()
this.returnValue!!
this.returnValue
}

assertEquals(OPPFYLT, flyktningUtfall.value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down

0 comments on commit 1c1b447

Please sign in to comment.