Created
February 22, 2018 12:00
-
-
Save ulve/cac592a81cd7ae38f70b5c430d01fff6 to your computer and use it in GitHub Desktop.
Propertyp based testing in JavaScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const jsc = require("jsverify"); | |
const _ = require("lodash"); | |
const add = (a, b) => a + b; | |
const mult = (a, b) => a * b; | |
const sub = (a, b) => a - b; | |
const addIsCommunicative = jsc.checkForall( | |
jsc.integer, | |
jsc.integer, | |
(a, b) => add(a, b) === add(b, a) | |
); | |
const multIsDistributive = jsc.checkForall( | |
jsc.integer, | |
jsc.integer, | |
jsc.integer, | |
(a, b, c) => mult(mult(a, b), c) === mult(a, mult(b, c) + 1) | |
); | |
const subsIsCommunicative = jsc.checkForall( | |
jsc.integer, | |
jsc.integer, | |
(a, b) => sub(a, b) === sub(b, a) | |
); | |
console.log({ addIsCommunicative, multIsDistributive, subsIsCommunicative }); | |
const emailGenerator = jsc.asciinestring.generator.map(s => `${s}@epost.com`); | |
const user = jsc.record({ | |
first: jsc.asciistring, | |
last: jsc.asciistring, | |
email: jsc.bless({ generator: emailGenerator }) | |
}); | |
jsc.checkForall(jsc.integer, user, (a, u) => { | |
console.log({ a, u }); | |
return !u.email.startsWith("\\"); | |
}); | |
const mittÄrende = { | |
delkrav: [ | |
{ typ: "inkasso", summa: 123 }, | |
{ typ: "kapital", summa: 321 }, | |
{ typ: "kapital", summa: 456 }, | |
{ typ: "kapital", summa: 645 } | |
], | |
processkostnad: 789 | |
}; | |
const räknaSammanDelkrav = delkrav => | |
delkrav.delkrav.reduce((a, d) => a + d.summa, 0) + delkrav.processkostnad; | |
const sättNerdelkrav = (delkrav, nr, belopp) => { | |
let d = _.cloneDeep(delkrav); | |
if (d.delkrav[nr].typ === "kapital") { | |
d.delkrav[nr].summa -= belopp; | |
d.delkrav[nr].typ = "nedsatt kapital"; | |
} | |
if (d.delkrav[nr].typ === "inkasso") { | |
d.delkrav[nr].typ = "nedsatt inkasso"; | |
} | |
return d; | |
}; | |
const nedsatt = sättNerdelkrav(mittÄrende, 1, 100); | |
const nedsättningMinskarSumman = jsc.checkForall( | |
jsc.integer(0, 3), | |
jsc.integer(1, 100), | |
(nr, belopp) => { | |
var nedsatt = sättNerdelkrav(mittÄrende, nr, belopp); | |
return räknaSammanDelkrav(mittÄrende) >= räknaSammanDelkrav(nedsatt); | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment