2017-11-06 17:05:45 +00:00
|
|
|
import { expect } from "chai"
|
2017-12-16 11:01:51 +00:00
|
|
|
import { rules as realRules, enrichRule } from '../source/engine/rules'
|
|
|
|
import { analyse, analyseMany, parseAll } from "../source/engine/traverse"
|
2017-11-07 08:48:13 +00:00
|
|
|
import { collectMissingVariables } from "../source/engine/generateQuestions"
|
2017-11-06 17:05:45 +00:00
|
|
|
import yaml from "js-yaml"
|
2017-11-07 08:48:13 +00:00
|
|
|
import dedent from "dedent-js"
|
2017-11-06 17:05:45 +00:00
|
|
|
|
|
|
|
describe("inversions", () => {
|
|
|
|
it("should handle non inverted example", () => {
|
|
|
|
let fakeState = { brut: 2300 }
|
|
|
|
let stateSelector = name => fakeState[name]
|
|
|
|
|
|
|
|
let
|
2017-11-20 12:16:18 +00:00
|
|
|
rawRules = dedent`
|
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: brut
|
|
|
|
taux: 77%
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-07 18:46:40 +00:00
|
|
|
analysis = analyse(rules, "net")(stateSelector)
|
2017-11-06 17:05:45 +00:00
|
|
|
|
2017-11-07 18:46:40 +00:00
|
|
|
expect(analysis.targets[0].nodeValue).to.be.closeTo(1771, 0.001)
|
2017-11-06 17:05:45 +00:00
|
|
|
})
|
2017-11-14 15:01:16 +00:00
|
|
|
|
2017-11-06 17:05:45 +00:00
|
|
|
|
2017-11-15 15:37:04 +00:00
|
|
|
it("should handle simple inversion", () => {
|
2017-11-07 08:48:13 +00:00
|
|
|
let fakeState = { net: 2000 }
|
|
|
|
let stateSelector = name => fakeState[name]
|
2017-11-06 17:05:45 +00:00
|
|
|
|
2017-11-07 08:48:13 +00:00
|
|
|
let rawRules = dedent`
|
2017-11-20 12:16:18 +00:00
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: brut
|
|
|
|
taux: 77%
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
|
|
|
formule:
|
|
|
|
inversion:
|
|
|
|
avec:
|
|
|
|
- net
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-07 18:46:40 +00:00
|
|
|
analysis = analyse(rules, "brut")(stateSelector)
|
2017-11-07 08:48:13 +00:00
|
|
|
|
2017-11-07 18:46:40 +00:00
|
|
|
expect(analysis.targets[0].nodeValue).to.be.closeTo(2000 / (77 / 100), 0.0001 * 2000)
|
2017-11-07 08:48:13 +00:00
|
|
|
})
|
|
|
|
|
2017-11-16 13:04:51 +00:00
|
|
|
it("should ask the input of one of the possible inversions", () => {
|
|
|
|
let rawRules = dedent`
|
2017-11-20 12:16:18 +00:00
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: assiette
|
|
|
|
variations:
|
|
|
|
- si: cadre
|
|
|
|
taux: 80%
|
|
|
|
- si: ≠ cadre
|
|
|
|
taux: 70%
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
|
|
|
formule:
|
|
|
|
inversion:
|
|
|
|
avec:
|
|
|
|
- net
|
|
|
|
- nom: cadre
|
|
|
|
- nom: assiette
|
|
|
|
formule: 67 + brut
|
|
|
|
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-16 13:04:51 +00:00
|
|
|
stateSelector = name => null,
|
|
|
|
analysis = analyse(rules, "brut")(stateSelector),
|
|
|
|
missing = collectMissingVariables(analysis.targets)
|
|
|
|
|
|
|
|
expect(analysis.targets[0].nodeValue).to.be.null
|
|
|
|
expect(missing).to.have.key("brut")
|
|
|
|
})
|
|
|
|
|
2017-11-07 08:48:13 +00:00
|
|
|
it("should handle inversions with missing variables", () => {
|
|
|
|
let rawRules = dedent`
|
2017-11-20 12:16:18 +00:00
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: assiette
|
|
|
|
variations:
|
|
|
|
- si: cadre
|
|
|
|
taux: 80%
|
|
|
|
- si: ≠ cadre
|
|
|
|
taux: 70%
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
|
|
|
formule:
|
|
|
|
inversion:
|
|
|
|
avec:
|
|
|
|
- net
|
|
|
|
- nom: cadre
|
|
|
|
- nom: assiette
|
|
|
|
formule: 67 + brut
|
|
|
|
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-07 08:48:13 +00:00
|
|
|
stateSelector = name => ({ net: 2000 }[name]),
|
2017-11-07 18:46:40 +00:00
|
|
|
analysis = analyse(rules, "brut")(stateSelector),
|
|
|
|
missing = collectMissingVariables(analysis.targets)
|
2017-11-06 17:05:45 +00:00
|
|
|
|
2017-11-07 18:46:40 +00:00
|
|
|
expect(analysis.targets[0].nodeValue).to.be.null
|
2017-11-07 08:48:13 +00:00
|
|
|
expect(missing).to.have.key("cadre")
|
|
|
|
})
|
2017-11-14 15:01:16 +00:00
|
|
|
|
|
|
|
it("shouldn't report a missing salary if another salary was input", () => {
|
|
|
|
let rawRules = dedent`
|
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: assiette
|
|
|
|
variations:
|
|
|
|
- si: cadre
|
|
|
|
taux: 80%
|
|
|
|
- si: ≠ cadre
|
|
|
|
taux: 70%
|
|
|
|
|
|
|
|
- nom: total
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: assiette
|
|
|
|
taux: 150%
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
2017-11-20 12:16:18 +00:00
|
|
|
formule:
|
|
|
|
inversion:
|
|
|
|
avec:
|
|
|
|
- net
|
|
|
|
- total
|
2017-11-14 15:01:16 +00:00
|
|
|
|
|
|
|
- nom: cadre
|
|
|
|
|
|
|
|
- nom: assiette
|
|
|
|
formule: 67 + brut
|
|
|
|
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-14 15:01:16 +00:00
|
|
|
stateSelector = name => ({ net: 2000, cadre: 'oui' }[name]),
|
|
|
|
analysis = analyse(rules, "total")(stateSelector),
|
|
|
|
missing = collectMissingVariables(analysis.targets)
|
|
|
|
|
|
|
|
expect(analysis.targets[0].nodeValue).to.equal(3750)
|
|
|
|
expect(missing).to.be.empty
|
|
|
|
})
|
|
|
|
|
2017-11-06 17:05:45 +00:00
|
|
|
})
|
2017-11-23 13:48:42 +00:00
|
|
|
|
|
|
|
it("complex inversion with composantes", () => {
|
|
|
|
let rawRules = dedent`
|
|
|
|
- nom: net
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: 67 + brut
|
|
|
|
taux: 80%
|
|
|
|
|
|
|
|
- nom: cotisation
|
|
|
|
formule:
|
|
|
|
multiplication:
|
|
|
|
assiette: 67 + brut
|
|
|
|
composantes:
|
|
|
|
- attributs:
|
|
|
|
dû par: employeur
|
|
|
|
taux: 100%
|
|
|
|
- attributs:
|
|
|
|
dû par: salarié
|
|
|
|
taux: 50%
|
|
|
|
|
|
|
|
- nom: total
|
|
|
|
formule: cotisation (employeur) + cotisation (salarié)
|
|
|
|
|
|
|
|
- nom: brut
|
|
|
|
format: euro
|
|
|
|
formule:
|
|
|
|
inversion:
|
|
|
|
avec:
|
|
|
|
- net
|
|
|
|
- total
|
|
|
|
`,
|
2017-11-28 11:45:06 +00:00
|
|
|
rules = parseAll(yaml.safeLoad(rawRules).map(enrichRule)),
|
2017-11-23 13:48:42 +00:00
|
|
|
stateSelector = name => ({ net: 2000 }[name]),
|
|
|
|
analysis = analyse(rules, "total")(stateSelector),
|
|
|
|
missing = collectMissingVariables(analysis.targets)
|
|
|
|
|
|
|
|
expect(analysis.targets[0].nodeValue).to.equal(3750)
|
|
|
|
expect(missing).to.be.empty
|
|
|
|
})
|
2017-12-16 11:01:51 +00:00
|
|
|
|
2017-12-19 11:52:51 +00:00
|
|
|
it('should collect missing variables not too slowly', function() {
|
2017-12-16 11:01:51 +00:00
|
|
|
let stateSelector = (name) => ({"contrat salarié . salaire net":"2300"})[name]
|
|
|
|
|
|
|
|
let rules = parseAll(realRules.map(enrichRule)),
|
|
|
|
analysis = analyseMany(rules,["salaire brut","salaire total"])(stateSelector)
|
|
|
|
|
|
|
|
let start = Date.now()
|
|
|
|
let missing = collectMissingVariables(analysis.targets)
|
|
|
|
let elapsed = Date.now()-start
|
2017-12-19 11:52:51 +00:00
|
|
|
expect(elapsed).to.be.below(500)
|
2017-12-16 11:01:51 +00:00
|
|
|
});
|