import R from 'ramda' import {expect} from 'chai' import {rules as realRules, enrichRule} from '../source/engine/rules' import {analyseSituation, analyseTopDown} from '../source/engine/traverse' import {buildNextSteps, collectMissingVariables, getObjectives} from '../source/engine/generateQuestions' let stateSelector = (name) => null describe('getObjectives', function() { it('should derive objectives from the root rule', function() { let rawRules = [ {nom: "startHere", formule: 2, "non applicable si" : "sum . evt . ko", espace: "sum"}, {nom: "evt", espace: "sum", formule: {"une possibilité":["ko"]}, titre: "Truc", question:"?"}, {nom: "ko", espace: "sum . evt"}], rules = rawRules.map(enrichRule), {root, parsedRules} = analyseTopDown(rules,"startHere")(stateSelector), result = getObjectives(stateSelector, root, parsedRules) expect(result).to.have.lengthOf(1) expect(result[0]).to.have.property('name','startHere') }); }); describe('collectMissingVariables', function() { it('should identify missing variables', function() { let rawRules = [ {nom: "startHere", formule: 2, "non applicable si" : "sum . evt . ko", espace: "sum"}, {nom: "evt", espace: "sum", formule: {"une possibilité":["ko"]}, titre: "Truc", question:"?"}, {nom: "ko", espace: "sum . evt"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.have.property('sum . evt . ko') }); it('should identify missing variables mentioned in expressions', function() { let rawRules = [ {nom: "startHere", formule: 2, "non applicable si" : "evt . nyet > evt . nope", espace: "sum"}, {nom: "nope", espace: "sum . evt"}, {nom: "nyet", espace: "sum . evt"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.have.property('sum . evt . nyet') expect(result).to.have.property('sum . evt . nope') }); it('should ignore missing variables in the formula if not applicable', function() { let rawRules = [ {nom: "startHere", formule: "trois", "non applicable si" : "3 > 2", espace: "sum"}, {nom: "trois", espace: "sum"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.deep.equal({}) }); it('should not report missing variables when "one of these" short-circuits', function() { let rawRules = [ {nom: "startHere", formule: "trois", "non applicable si" : {"une de ces conditions": ["3 > 2", "trois"]}, espace: "sum"}, {nom: "trois", espace: "sum"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.deep.equal({}) }); it('should report missing variables in switch statements', function() { let rawRules = [ { nom: "startHere", formule: {"aiguillage numérique": { "11 > dix":"1000%", "3 > dix":"1100%", "1 > dix":"1200%" }}, espace: "top"}, {nom: "dix", espace: "top"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.have.property('top . dix') }); it('should not report missing variables in switch for consequences of false conditions', function() { let rawRules = [ { nom: "startHere", formule: {"aiguillage numérique": { "8 > 10":"1000%", "1 > 2":"dix" }}, espace: "top"}, {nom: "dix", espace: "top"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.deep.equal({}) }); it('should report missing variables in consequence when its condition is unresolved', function() { let rawRules = [ { nom: "startHere", formule: { "aiguillage numérique": { "10 > 11": "1000%", "3 > dix": { "douze": "560%", "1 > 2": "75015%" } } }, espace: "top" }, { nom: "douze", espace: "top" }, { nom: "dix", espace: "top" } ], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules, "startHere")(stateSelector), result = collectMissingVariables()(stateSelector, situation); expect(result).to.have.property('top . dix') expect(result).to.have.property('top . douze') }); it('should not report missing variables when a switch short-circuits', function() { let rawRules = [ { nom: "startHere", formule: {"aiguillage numérique": { "11 > 10":"1000%", "3 > dix":"1100%", "1 > dix":"1200%" }}, espace: "top"}, {nom: "dix", espace: "top"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"startHere")(stateSelector), result = collectMissingVariables()(stateSelector,situation) expect(result).to.deep.equal({}) }); }); describe('buildNextSteps', function() { it('should generate questions', function() { let rawRules = [ {nom: "sum", formule: {somme: [2, "deux"]}, espace: "top"}, {nom: "deux", formule: 2, "non applicable si" : "top . sum . evt . ko", espace: "top"}, {nom: "evt", espace: "top . sum", formule: {"une possibilité":["ko"]}, titre: "Truc", question:"?"}, {nom: "ko", espace: "top . sum . evt"}], rules = rawRules.map(enrichRule), situation = analyseTopDown(rules,"sum")(stateSelector), result = buildNextSteps(stateSelector, rules, situation) expect(result).to.have.lengthOf(1) expect(R.path(["question","props","label"])(result[0])).to.equal("?") }); it('should generate questions from the real rules', function() { let rules = realRules.map(enrichRule), situation = analyseTopDown(rules,"surcoût CDD")(stateSelector), objectives = getObjectives(stateSelector, situation.root, situation.parsedRules), result = buildNextSteps(stateSelector, rules, situation) expect(objectives).to.have.lengthOf(4) expect(result).to.have.lengthOf(6) expect(R.path(["question","props","label"])(result[0])).to.equal("Pensez-vous être confronté à l'un de ces événements au cours du contrat ?") expect(R.path(["question","props","label"])(result[1])).to.equal("Quel est le motif de recours au CDD ?") expect(R.path(["question","props","label"])(result[2])).to.equal("Quel est le salaire brut ?") expect(R.path(["question","props","label"])(result[3])).to.equal("Est-ce un contrat jeune vacances ?") expect(R.path(["question","props","label"])(result[4])).to.equal("Quelle est la durée du contrat ?") expect(R.path(["question","props","label"])(result[5])).to.equal("Combien de jours de congés ne seront pas pris ?") }); });