1
0
Fork 0
mirror of https://github.com/betagouv/mon-entreprise synced 2025-02-20 20:05:01 +00:00
mon-entreprise/mon-entreprise/test/real-rules.test.js
Johan Girod ba01ae2d4f ⚙️🔥 Ajoute un AST bien typé pour publicodes
- Introduction de nouveaux mécanismes
- Réecriture de l'evaluation et du parsing des règles.
- Les règles peuvent apparaître dans les formules de calcul
- Introduction d'un AST en bonne et due forme
- Réecriture de buildRuleDependancies.
- Ajout d'une passe pour la désambiguation des références
- Réecriture de rendNonApplicable et de remplace
- Réimplémentation de parentDependancy

Voir #1191
2020-12-07 14:39:53 +01:00

57 lines
1.7 KiB
JavaScript

import { AssertionError } from 'chai'
import Engine, { parsePublicodes } from 'publicodes'
import { disambiguateRuleReference } from '../../publicodes/source/ruleUtils'
import rules from 'Rules'
// les variables dans les tests peuvent être exprimées relativement à l'espace de nom de la règle,
// comme dans sa formule
let parsedRules = parsePublicodes(rules)
const engine = new Engine(parsedRules)
let runExamples = (examples, rule) =>
examples.map(ex => {
const expected = ex['valeur attendue']
const situation = Object.entries(ex.situation).reduce(
(acc, [name, value]) => ({
...acc,
[disambiguateRuleReference(engine.parsedRules, rule.dottedName, name)]: value
}),
{}
)
const evaluation = engine
.setSituation(situation)
.evaluate(rule.dottedName, {
unit: rule['unité par défaut']
})
const ok =
evaluation.nodeValue === expected
? true
: typeof expected === 'number'
? Math.abs((evaluation.nodeValue - expected) / expected) < 0.001
: false
return { ...ex, ok, rule: evaluation }
})
describe('Tests des règles de notre base de règles', () =>
Object.values(parsedRules).map(rule => {
if (!rule?.exemples) return null
describe(rule.dottedName, () => {
let examples = runExamples(rule.exemples, rule)
examples.map(example =>
it(example.nom + '', () => {
if (!example.ok) {
throw new AssertionError(`
Valeur attendue : ${example['valeur attendue']}
Valeur obtenue : ${example.rule.nodeValue}
${
example.rule.nodeValue === null
? 'Variables manquantes : ' +
JSON.stringify(example.rule.missingVariables, null, 4)
: ''
}
`)
}
})
)
})
}))