diff --git a/debian/clean b/debian/clean new file mode 100644 index 0000000..c3af857 --- /dev/null +++ b/debian/clean @@ -0,0 +1 @@ +lib/ diff --git a/debian/control b/debian/control index 1e805ec..460603f 100644 --- a/debian/control +++ b/debian/control @@ -5,8 +5,12 @@ Uploaders: Thorsten Alteholz Build-Depends: debhelper-compat (= 13) , dh-sequence-nodejs + , mocha , node-assert , node-boolbase + , node-expect.js + , node-typescript + , node-typescript-types Standards-Version: 4.5.1 Vcs-Browser: https://salsa.debian.org/js-team/node-nth-check Vcs-Git: https://salsa.debian.org/js-team/node-nth-check.git diff --git a/debian/tests/pkg-js/files b/debian/tests/pkg-js/files new file mode 100644 index 0000000..1cbb2d9 --- /dev/null +++ b/debian/tests/pkg-js/files @@ -0,0 +1 @@ +debian/tests/test diff --git a/debian/tests/pkg-js/test b/debian/tests/pkg-js/test index 92e4509..c05037f 100644 --- a/debian/tests/pkg-js/test +++ b/debian/tests/pkg-js/test @@ -1 +1 @@ -node test.js +mocha debian/tests/test/*.js diff --git a/debian/tests/test/__fixtures__/rules.js b/debian/tests/test/__fixtures__/rules.js new file mode 100644 index 0000000..c55b3f8 --- /dev/null +++ b/debian/tests/test/__fixtures__/rules.js @@ -0,0 +1,51 @@ +const valid = [ + ["1", [0, 1]], + ["2", [0, 2]], + ["3", [0, 3]], + ["5", [0, 5]], + [" 1 ", [0, 1]], + [" 5 ", [0, 5]], + ["+2n + 1", [2, 1]], + ["-1", [0, -1]], + ["-1n + 3", [-1, 3]], + ["-1n+3", [-1, 3]], + ["-n+2", [-1, 2]], + ["-n+3", [-1, 3]], + ["0n+3", [0, 3]], + ["1n", [1, 0]], + ["1n+0", [1, 0]], + ["2n", [2, 0]], + ["2n + 1", [2, 1]], + ["2n+1", [2, 1]], + ["3n", [3, 0]], + ["3n+0", [3, 0]], + ["3n+1", [3, 1]], + ["3n+2", [3, 2]], + ["3n+3", [3, 3]], + ["3n-1", [3, -1]], + ["3n-2", [3, -2]], + ["3n-3", [3, -3]], + ["even", [2, 0]], + ["n", [1, 0]], + ["n+2", [1, 2]], + ["odd", [2, 1]], + + // Surprisingly, neither sizzle, qwery or nwmatcher cover these cases + ["-4n+13", [-4, 13]], + ["-2n + 12", [-2, 12]], +]; + +const invalid = [ + "-", + "- 1n", + "-1 n", + "2+0", + "2n+-0", + "an+b", + "asdf", + "b", + "expr", + "odd|even|x", +]; + +module.exports = {valid, invalid}; diff --git a/debian/tests/test/compile.spec.js b/debian/tests/test/compile.spec.js new file mode 100644 index 0000000..deac254 --- /dev/null +++ b/debian/tests/test/compile.spec.js @@ -0,0 +1,41 @@ +const expect = require('expect.js'); +const nthCheck = require('../../../lib'); +const compile = nthCheck.compile; +const { valid } = require("./__fixtures__/rules"); + +const valArray = new Array(...Array(2e3)).map((_, i) => i); + +/** + * Iterate through all possible values. This is adapted from qwery, + * and uses a more intuitive way to process all elements. + */ +function slowNth([a, b]) { + if (a === 0 && b > 0) return [b - 1]; + + return valArray.filter((val) => { + for (let i = b; a > 0 ? i <= valArray.length : i >= 1; i += a) { + if (val === valArray[i - 1]) return true; + } + return false; + }); +} + +describe("parse", () => { + it("compile & run all valid", () => { + for (const [_, parsed] of valid) { + const filtered = valArray.filter(compile(parsed)); + const iterated = slowNth(parsed); + + expect(filtered).to.eql(iterated); + } + }); + + it("parse, compile & run all valid", () => { + for (const [rule, parsed] of valid) { + const filtered = valArray.filter(nthCheck.default(rule)); + const iterated = slowNth(parsed); + + expect([filtered, rule]).to.eql([iterated, rule]); + } + }); +}); diff --git a/debian/tests/test/parse.spec.js b/debian/tests/test/parse.spec.js new file mode 100644 index 0000000..73f51fe --- /dev/null +++ b/debian/tests/test/parse.spec.js @@ -0,0 +1,17 @@ +const expect = require('expect.js'); +const { parse } = require("../../../lib/parse"); +const { valid, invalid } = require("./__fixtures__/rules"); + +describe("parse", () => { + it("parse invalid", () => { + for (const formula of invalid) { + expect(() => parse(formula)).to.throwError(Error); + } + }); + + it("parse valid", () => { + for (const [formula, result] of valid) { + expect(parse(formula)).to.eql(result); + } + }); +});