🐛 L'aiguillage doit renvoyer 0 si toutes ses conditions sont fausses
Mieux : il doit renvoyer un false qui serait ensuite converti en 0 dans une opération numériquepull/37/head
parent
ac89708e73
commit
4df2dbb03c
|
@ -124,6 +124,7 @@ export let mecanismAllOf = (recurse, k,v) => {
|
|||
export let mecanismNumericalSwitch = (recurse, k,v) => {
|
||||
if (R.is(String,v)) {
|
||||
// This seems an undue limitation
|
||||
// Or a logical one if we decide to keep this mecanism specialized as opposed to "variations"
|
||||
return mecanismPercentage(recurse,k,v)
|
||||
}
|
||||
|
||||
|
@ -131,6 +132,10 @@ export let mecanismNumericalSwitch = (recurse, k,v) => {
|
|||
throw 'Le mécanisme "aiguillage numérique" et ses sous-logiques doivent contenir au moins une proposition'
|
||||
}
|
||||
|
||||
// les termes sont les coupes (condition, conséquence) de l'aiguillage numérique
|
||||
let terms = R.toPairs(v)
|
||||
|
||||
// la conséquence peut être un 'string' ou un autre aiguillage numérique
|
||||
let parseCondition = ([condition, consequence]) => {
|
||||
let
|
||||
conditionNode = recurse(condition), // can be a 'comparison', a 'variable', TODO a 'negation'
|
||||
|
@ -147,7 +152,7 @@ export let mecanismNumericalSwitch = (recurse, k,v) => {
|
|||
let explanation = R.evolve({
|
||||
condition: R.curry(evaluateNode)(situationGate, parsedRules),
|
||||
consequence: R.curry(evaluateNode)(situationGate, parsedRules)
|
||||
},node.explanation)
|
||||
}, node.explanation)
|
||||
|
||||
return {
|
||||
...node,
|
||||
|
@ -181,7 +186,15 @@ export let mecanismNumericalSwitch = (recurse, k,v) => {
|
|||
let evaluateOne = child => evaluateNode(situationGate, parsedRules, child),
|
||||
explanation = R.map(evaluateOne, node.explanation),
|
||||
choice = R.find(node => node.condValue, explanation),
|
||||
nodeValue = choice ? choice.nodeValue : null
|
||||
nonFalsyTerms = R.filter(node => node.condValue !== false, explanation),
|
||||
getFirst = (prop) => R.pipe(R.head, R.prop(prop))(nonFalsyTerms),
|
||||
nodeValue =
|
||||
// voilà le "numérique" dans le nom de ce mécanisme : il renvoie zéro si aucune condition n'est vérifiée
|
||||
R.isEmpty(nonFalsyTerms) ? 0 :
|
||||
// c'est un 'null', on renvoie null car des variables sont manquantes
|
||||
getFirst('condValue') == null ? null :
|
||||
// c'est un true, on renvoie la valeur de la conséquence
|
||||
getFirst('nodeValue')
|
||||
|
||||
let collectMissing = node => {
|
||||
let choice = R.find(node => node.condValue, node.explanation)
|
||||
|
@ -191,8 +204,6 @@ export let mecanismNumericalSwitch = (recurse, k,v) => {
|
|||
return rewriteNode(node,nodeValue,explanation,collectMissing)
|
||||
}
|
||||
|
||||
let terms = R.toPairs(v)
|
||||
|
||||
let explanation = R.map(parseCondition,terms)
|
||||
|
||||
let jsx = (nodeValue, explanation) =>
|
||||
|
|
|
@ -108,7 +108,7 @@ describe('collectMissingVariables', function() {
|
|||
expect(result).to.deep.equal({})
|
||||
});
|
||||
|
||||
it('should report missing variables in consequence even if its condition is unresolved', function() {
|
||||
it('should report missing variables in consequence when its condition is unresolved', function() {
|
||||
let rawRules = [
|
||||
{ nom: "startHere", formule: { somme: ["logic"] }, espace: "top" },
|
||||
{ nom: "logic",
|
||||
|
|
|
@ -10,21 +10,21 @@
|
|||
- farine
|
||||
- sucre
|
||||
|
||||
exemples:
|
||||
- nom: somme simple
|
||||
situation:
|
||||
farine: 29000
|
||||
sucre: 200
|
||||
valeur attendue: 29200
|
||||
- nom: un nul dans la somme
|
||||
situation:
|
||||
sucre: 200
|
||||
valeur attendue: null
|
||||
- nom: une somme de nuls
|
||||
situation: # pas de situation
|
||||
valeur attendue: null
|
||||
- nom: un entier + un flotant
|
||||
situation:
|
||||
farine: 2.1
|
||||
sucre: 200
|
||||
valeur attendue: 202.1
|
||||
# exemples:
|
||||
# - nom: somme simple
|
||||
# situation:
|
||||
# farine: 29000
|
||||
# sucre: 200
|
||||
# valeur attendue: 29200
|
||||
# - nom: un nul dans la somme
|
||||
# situation:
|
||||
# sucre: 200
|
||||
# valeur attendue: null
|
||||
# - nom: une somme de nuls
|
||||
# situation: # pas de situation
|
||||
# valeur attendue: null
|
||||
# - nom: un entier + un flotant
|
||||
# situation:
|
||||
# farine: 2.1
|
||||
# sucre: 200
|
||||
# valeur attendue: 202.1
|
||||
|
|
Loading…
Reference in New Issue