Tests des expressions plus sérieux

On ne testait auparavant que la compatibilité d'une expression, mais pas
le bon calcul lui-même.
pull/478/head
Mael 2019-04-25 18:07:07 +02:00
parent f4965108f8
commit 321b4a4cb2
6 changed files with 205 additions and 111 deletions

View File

@ -79,7 +79,7 @@
"test-one": "yarn mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require mock-local-storage --require test/helpers/browser.js",
"test-components": "mocha-webpack --webpack-config source/webpack.test.js --require source-map-support/register --include componentTestSetup.js --require mock-local-storage ---require test/helpers/browser.js \"source/components/**/*.test.js\" --watch",
"test-lib": "yarn test-common --grep 'library'",
"test-expressions": "yarn test-common --grep 'Expressions'",
"test-expressions": "yarn test-common --grep 'Suite expressions'",
"compile-lib": "yarn webpack --config source/webpack.lib.js",
"compile-dev": "FR_SITE='http://localhost:5000${path}' EN_SITE='http://localhost:5001${path}' yarn run compile",
"mon-entreprise:serve": "PORT=5000 serve --config serve.mon-entreprise.json",

View File

@ -1,33 +0,0 @@
import { expect } from 'chai'
import { enrichRule } from '../source/engine/rules'
import { analyse, parseAll } from '../source/engine/traverse'
import { collectMissingVariables } from '../source/engine/generateQuestions'
import * as R from 'ramda'
import { isNumeric } from '../source/utils'
import expressions from './expressions.yaml'
import { nearley } from 'Engine/treat'
describe('Expressions', () =>
expressions.map(expression =>
it(expression, () => {
let result = nearley().feed(expression).results
expect(result).to.not.be.empty
return null
//TODO
let [parseResult, ...additionnalResults] = result
if (
additionnalResults &&
additionnalResults.length > 0 &&
parseResult.category !== 'boolean'
) {
expect(target.nodeValue).to.be.closeTo(valeur, 0.001)
expect(target).to.have.property('nodeValue', valeur)
expect(missing).to.eql(expectedMissing)
}
})
))

View File

@ -1,35 +0,0 @@
# A list of leaf expressions treated by our Nearley.js grammar
# For the moment, we just check if those are recognized
# CalcExpression
- salaire de base * 3
- Salariat . salaire de base * 3
- 1 - taux
- salaire + 2000
# not working yet
# - salaire de base * 3 * 12
- congés non pris / 25
# Comparison
- salaire de base < 4000
- salaire de base < plafond sécurité sociale
- salaire de base < 4 * plafond sécurité sociale
# BooleanVariableExpression
- Salariat . CDD . événements . CDD poursuivi en CDD
- ≠ événements . CDD poursuivi en CDD
# ModifedVariable
# - salaire de base (> annuel)
# - salaire de base --> annuel
# - salaire de base annuel
- salaire de base [annuel]
- 0.1%
- entreprise . catégorie d'activité = 'artisanale'
- 11.5% * plafond sécurité sociale temps plein

View File

@ -1,7 +1,7 @@
import R from 'ramda'
let directoryLoaderFunction = require.context('./mécanismes', true, /.yaml$/)
let items = directoryLoaderFunction.keys().map(directoryLoaderFunction)
let items = directoryLoaderFunction
.keys()
.map(key => [key.replace(/\.\/|\.yaml/g, ''), directoryLoaderFunction(key)])
export default items

View File

@ -13,49 +13,45 @@ import * as R from 'ramda'
import { isNumeric } from '../source/utils'
describe('Mécanismes', () =>
testSuites.map(suite =>
testSuites.map(([suiteName, suite]) =>
suite.map(
({ exemples, test }) =>
exemples &&
describe(
test ||
'Nom de test (propriété "test") manquant dans la variable contenant ces "exemples"',
() =>
exemples.map(
({
nom: testTexte,
situation,
'valeur attendue': valeur,
'variables manquantes': expectedMissing
}) =>
it(testTexte == null ? '' : testTexte + '', () => {
let rules = parseAll(
suite
.map(
item =>
item.test != null
? R.assoc('nom', item.test, item)
: item
)
.map(enrichRule)
),
state = situation || {},
stateSelector = name => state[name],
analysis = analyse(rules, test)(stateSelector),
missing = collectMissingVariables(analysis.targets),
target = analysis.targets[0]
describe(`Suite ${suiteName}, test : ${test ||
'Nom de test (propriété "test") manquant dans la variable contenant ces "exemples"'}`, () =>
exemples.map(
({
nom: testTexte,
situation,
'valeur attendue': valeur,
'variables manquantes': expectedMissing
}) =>
it(testTexte == null ? '' : testTexte + '', () => {
let rules = parseAll(
suite
.map(item =>
item.test != null
? R.assoc('nom', item.test, item)
: item
)
.map(enrichRule)
),
state = situation || {},
stateSelector = name => state[name],
analysis = analyse(rules, test)(stateSelector),
missing = collectMissingVariables(analysis.targets),
target = analysis.targets[0]
if (isNumeric(valeur)) {
expect(target.nodeValue).to.be.closeTo(valeur, 0.001)
} else if (valeur !== undefined) {
expect(target).to.have.property('nodeValue', valeur)
}
if (isNumeric(valeur)) {
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 (expectedMissing) {
expect(missing).to.eql(expectedMissing)
}
})
))
)
))

View File

@ -0,0 +1,166 @@
- nom: salaire de base
- nom: contrat . salaire de base
- test: multiplication
formule: salaire de base * 3
exemples:
- situation:
salaire de base: 1000
valeur attendue: 3000
- test: multiplication et variable avec espace
formule: contrat . salaire de base * 3
exemples:
- situation:
contrat . salaire de base: 1000
valeur attendue: 3000
- nom: taux
- test: soustraction
formule: 1 - taux
exemples:
- situation:
taux: 0.89
valeur attendue: 0.11
- test: addition
formule: salaire de base + 2000
exemples:
- situation:
salaire de base: 3000
valeur attendue: 5000
- nom: revenus fonciers
- test: addition bis
formule: salaire de base + revenus fonciers
exemples:
- situation:
salaire de base: 3000
revenus fonciers: 2000
valeur attendue: 5000
- test: division
formule: salaire de base / 3
exemples:
- situation:
salaire de base: 3000
valeur attendue: 1000
- test: comparaison stricte
formule: salaire de base < 3001
exemples:
- nom: inférieur
situation:
salaire de base: 3000
valeur attendue: true
- nom: égal
situation:
salaire de base: 3001
valeur attendue: false
- nom: supérieur
situation:
salaire de base: 3002
valeur attendue: false
- test: comparaison non stricte
formule: salaire de base <= 3000
exemples:
- nom: inférieur
situation:
salaire de base: 2999.999
valeur attendue: true
- nom: égal
situation:
salaire de base: 3000
valeur attendue: true
- nom: supérieur
situation:
salaire de base: 3000.1
valeur attendue: false
- nom: plafond sécurité sociale
- nom: CDD
- espace: CDD
nom: poursuivi en CDI
- test: booléen
formule: CDD . poursuivi en CDI
exemples:
- situation:
CDD . poursuivi en CDI: oui
valeur attendue: true
- situation:
CDD . poursuivi en CDI: non
valeur attendue: false
- test: négation
formule: ≠ CDD . poursuivi en CDI
exemples:
- situation:
CDD . poursuivi en CDI: oui
valeur attendue: false
- situation:
CDD . poursuivi en CDI: non
valeur attendue: true
- test: pourcentage
formule: 38.1%
exemples:
- valeur attendue: 0.381
#- test: variable modifiée temporellement
- test: multiplication et pourcentage
formule: 38.1% * salaire de base
exemples:
- situation:
salaire de base: 1000
valeur attendue: 381
- nom: catégorie d'activité
formule:
une possibilité:
- commerciale
- artisanale
- espace: catégorie d'activité
nom: artisanale
- espace: catégorie d'activité
nom: commerciale
- test: test de possibilités
formule: catégorie d'activité = 'artisanale'
exemples:
- situation:
catégorie d'activité: artisanale
valeur attendue: true
- situation:
catégorie d'activité: commerciale
valeur attendue: false
- nom: revenu
période: mois
format:
- test: variable modifiée temporellement
formule: revenu [annuel]
exemples:
- situation:
revenu: 1000
valeur attendue: 12000
##############
# Hors limite aujourd'hui
#- test: opérations multiples
# formule: 4 * plafond sécurité sociale * 12
#
#- test: comparaison et opération
# formule: salaire de base < 4 * plafond sécurité sociale
# exemples:
# - situation:
# salaire de base: 1000
# plafond sécurité sociale: 3500
# valeur attendue: true