diff --git a/package.json b/package.json index ce9e0d9..7e69c02 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "scripts": { "clean": "rm -r publicodes-voiture.model.json index.d.ts index.js", "build": "node build.js", + "test": "vitest run", "generate": "node scripts/generate-empreinte.js", "doc": "yarn run build && cd online-doc && yarn run dev", "doc:build": "yarn run build && cd online-doc && yarn run build" @@ -34,6 +35,7 @@ "devDependencies": { "@publicodes/tools": "^1.2.5", "csv-parser": "^3.0.0", + "vitest": "^2.1.1" }, "peerDependencies": { "publicodes": "^1.5.1" diff --git a/rules/couts/voiture-decote.publicodes b/rules/couts/voiture-decote.publicodes index e65f3b3..34b1f1f 100644 --- a/rules/couts/voiture-decote.publicodes +++ b/rules/couts/voiture-decote.publicodes @@ -27,8 +27,16 @@ décote: alors: 45% - si: durée décote <= 4 alors: 55% - - sinon: 60% + - sinon: 60 + (5 * (durée décote - 5)) + plafond: 80% + unité: "%" note: | + Nous avons choisi un plafond de 80% pour la décote. Cette valeur est + arbitraire mais nous considérons que la valeur de revente d'une voiture + ne peut pas descendre en dessous de 20% de sa valeur d'achat. Nous + n'avons pas trouvé de sources fiables pour justifier ce choix, cela + pourrait être un point d'amélioration pour ce modèle. + ### Sources Selon cet diff --git a/rules/voiture.publicodes b/rules/voiture.publicodes index 3ce3776..5a57bc9 100644 --- a/rules/voiture.publicodes +++ b/rules/voiture.publicodes @@ -13,14 +13,21 @@ voiture . prix d'achat: par défaut: variations: - si: voiture . occasion - #FIXME: décote depend de prix d'achat -> non applicable. - alors: prix d'achat . estimé * décote + alors: prix d'achat . estimé * (100% - décote) - sinon: prix d'achat . estimé plancher: 1 unité: € description: | Renseignez le montant que vous avez payé pour l'achat de votre voiture (hors primes ou aides à l'achat) qu'elle soit neuve ou d'occasion. + test: + prix d'achat par défaut: + contexte: [] + valeur attendue: 38000 € + prix d'achat occasion: + contexte: + voiture . occasion: oui + valeur attendue: 38000 € * 20% voiture . occasion: titre: Achat d'occasion diff --git a/test/inline.test.js b/test/inline.test.js new file mode 100644 index 0000000..3f07b8b --- /dev/null +++ b/test/inline.test.js @@ -0,0 +1,27 @@ +import Engine from "publicodes" +import { getModelFromSource } from "@publicodes/tools/compilation" +import { expect, test, describe } from "vitest" + +const model = getModelFromSource("rules/**/*.publicodes") + +const engine = new Engine(model) +const defaultEngine = engine.shallowCopy() + +Object.entries(model).forEach(([ruleName, rule]) => { + if (rule && "test" in rule) { + describe(ruleName, () => { + Object.entries(rule.test).forEach(([testName, testInfos]) => { + test(testName, () => { + const context = testInfos.contexte || {} + const expected = defaultEngine.evaluate(testInfos["valeur attendue"]) + + engine.setSituation(context) + const actual = engine.evaluate(ruleName) + + expect(actual.nodeValue).toEqual(expected.nodeValue) + expect(actual.unit).toEqual(expected.unit) + }) + }) + }) + } +})