From 4df2dbb03c3f15990afa67cea70cad0680f15aae Mon Sep 17 00:00:00 2001 From: mama Date: Wed, 16 Aug 2017 11:21:42 +0200 Subject: [PATCH] :bug: L'aiguillage doit renvoyer 0 si toutes ses conditions sont fausses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mieux : il doit renvoyer un false qui serait ensuite converti en 0 dans une opération numérique --- source/engine/mecanisms.js | 19 ++++++++++++++---- test/generateQuestions.test.js | 2 +- test/mécanismes/somme.yaml | 36 +++++++++++++++++----------------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/source/engine/mecanisms.js b/source/engine/mecanisms.js index b80839d81..0d316ad2a 100644 --- a/source/engine/mecanisms.js +++ b/source/engine/mecanisms.js @@ -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) => diff --git a/test/generateQuestions.test.js b/test/generateQuestions.test.js index 91e3cca6c..7975ede17 100644 --- a/test/generateQuestions.test.js +++ b/test/generateQuestions.test.js @@ -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", diff --git a/test/mécanismes/somme.yaml b/test/mécanismes/somme.yaml index 9c6a8c399..313d727bb 100644 --- a/test/mécanismes/somme.yaml +++ b/test/mécanismes/somme.yaml @@ -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