Skip to content

Instantly share code, notes, and snippets.

@ulve
Created February 22, 2018 12:00
Show Gist options
  • Save ulve/cac592a81cd7ae38f70b5c430d01fff6 to your computer and use it in GitHub Desktop.
Save ulve/cac592a81cd7ae38f70b5c430d01fff6 to your computer and use it in GitHub Desktop.
Propertyp based testing in JavaScript
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