68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
/*
|
|
Les mécanismes sont testés dans mécanismes/ comme le sont les variables
|
|
directement dans la base Publicode. On construit dans chaque fichier une base
|
|
Publicode 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 { collectMissingVariables } from '../source/engine/generateQuestions'
|
|
import { enrichRule } from '../source/engine/rules'
|
|
import { analyse, parseAll } from '../source/engine/traverse'
|
|
import { parseUnit } from '../source/engine/units'
|
|
import testSuites from './load-mecanism-tests'
|
|
|
|
describe('Mécanismes', () =>
|
|
testSuites.map(([suiteName, suite]) =>
|
|
Object.keys(suite)
|
|
.map(key => [key, suite[key] ?? undefined])
|
|
.map(
|
|
([name, { exemples, titre, 'unité attendue': unit } = {}]) =>
|
|
exemples &&
|
|
describe(`Suite ${suiteName}, test : ${titre ?? name}`, () =>
|
|
exemples.map(
|
|
({
|
|
nom: testTexte,
|
|
situation,
|
|
'unités par défaut': defaultUnits,
|
|
'valeur attendue': valeur,
|
|
'variables manquantes': expectedMissing
|
|
}) =>
|
|
it(testTexte == null ? '' : testTexte + '', () => {
|
|
let rules = parseAll(
|
|
Object.entries(suite)
|
|
.map(([dottedName, rule]) => ({
|
|
dottedName,
|
|
...rule
|
|
}))
|
|
.map(enrichRule)
|
|
),
|
|
state = situation || {},
|
|
stateSelector = name => state[name],
|
|
analysis = analyse(
|
|
rules,
|
|
name,
|
|
defaultUnits
|
|
)(stateSelector),
|
|
missing = collectMissingVariables(analysis.targets),
|
|
target = analysis.targets[0]
|
|
|
|
if (typeof valeur === 'number') {
|
|
expect(target.nodeValue).to.be.closeTo(valeur, 0.001)
|
|
} else if (valeur !== undefined) {
|
|
expect(target).to.have.property('nodeValue', valeur)
|
|
}
|
|
|
|
if (expectedMissing) {
|
|
expect(missing).to.eql(expectedMissing)
|
|
}
|
|
|
|
if (unit) {
|
|
expect(target.unit).not.to.be.equal(undefined)
|
|
expect(target.unit).to.deep.equal(parseUnit(unit))
|
|
}
|
|
})
|
|
))
|
|
)
|
|
))
|