diff --git a/test/load-mecanism-tests.js b/test/load-mecanism-tests.js new file mode 100644 index 000000000..8ead0d25a --- /dev/null +++ b/test/load-mecanism-tests.js @@ -0,0 +1,23 @@ +import R from 'ramda' + +// This array can't be generated, as the arguments to require.context must be literals :-| +let directoryLoaders = + [ + + ] + +// require.context returns an object which +// a) is a function behaving like 'requires', taking a filename and returning a module and +// b) has additional properties, some function-valued; keys() returns the files matched +// A "module" is simply the contents of a file according to a Webpack loader; this can be JS, JSON, etc. +// Thus, this weird loadAll returns an array, each item of which is the contents of each file in a directory +let loadAll = directoryLoaderFunction => + directoryLoaderFunction.keys().map(directoryLoaderFunction) + +let directoryLoaderFunction = + require.context('./mécanismes', true, /.yaml$/) + +let items = + loadAll(directoryLoaderFunction) + +export default items diff --git a/test/mecanisms.test.js b/test/mecanisms.test.js new file mode 100644 index 000000000..413a0906b --- /dev/null +++ b/test/mecanisms.test.js @@ -0,0 +1,33 @@ +/* + Les mécanismes sont testés dans mécanismes/ comme le sont les variables directement dans la base YAML. + On y créée dans chaque fichier une base YAML autonome, dans laquelle intervient le mécanisme à tester, + puis on teste idéalement tous ses comportements sans en faire intervenir d'autres. +*/ + +import {expect} from 'chai' +import {enrichRule} from '../source/engine/rules' +import {analyseSituation} from '../source/engine/traverse' +import testBatteries from './load-mecanism-tests' + + +describe('mécanismes', () => + testBatteries.map( battery => + describe('mecanisme' + Math.random(), function() { + battery.map(({exemples, nom}) => + exemples && exemples.map(({nom: testTexte, situation, 'valeur attendue': valeur}) => + it(testTexte + '', () => { + let rules = battery.map(enrichRule), + state = situation || {}, + analysis = analyseSituation(rules, nom)(name => state[name]) + + // console.log('JSON.stringify(analysis', JSON.stringify(analysis)) + expect(analysis) + .to.have.property( + 'nodeValue', + valeur + ) + }) + )) + }) + ) +) diff --git a/test/mécanismes/aiguillage-numérique.yaml b/test/mécanismes/aiguillage-numérique.yaml index e9c1b1735..9247670cb 100644 --- a/test/mécanismes/aiguillage-numérique.yaml +++ b/test/mécanismes/aiguillage-numérique.yaml @@ -8,7 +8,7 @@ - nom: taulard cyclothymique - nom: nombre de gigolos rachitiques - + format: nombre - nom: aiguillage numérique simple @@ -28,7 +28,7 @@ taulard cyclothymique: non nombre de gigolos rachitiques: 1801 valeur attendue: 0.015 - - nom: aucun aiguillage n'est activé -> 0 + - nom: aucun aiguillage n'est activé situation: taulard cyclothymique: non nombre de gigolos rachitiques: 1789 diff --git a/test/mécanismes/somme.yaml b/test/mécanismes/somme.yaml new file mode 100644 index 000000000..9c6a8c399 --- /dev/null +++ b/test/mécanismes/somme.yaml @@ -0,0 +1,30 @@ +- nom: farine + format: kg + +- nom: sucre + format: kg + +- nom: poids total + formule: + somme: + - 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 diff --git a/test/traverse.test.js b/test/traverse.test.js index f031a3e24..18fe585af 100644 --- a/test/traverse.test.js +++ b/test/traverse.test.js @@ -1,6 +1,5 @@ import {expect} from 'chai' import {enrichRule} from '../source/engine/rules' -import {treatRuleRoot} from '../source/engine/traverse' import {analyseSituation} from '../source/engine/traverse' let stateSelector = (state, name) => null