nope-js-browser
Version:
NoPE Runtime for the Browser. For nodejs please use nope-js-node
195 lines (194 loc) • 7.84 kB
JavaScript
import { assert } from "chai";
import { describe, it } from "mocha";
import { countArguments, fillOptionalArguments, _extractArgumentsPartFromFunction, } from "./functionMethods";
describe("functionMethods", function () {
// Describe the required Test:
describe("countArguments - static functions", function () {
function test1() {
console.log("test");
}
function test2(a, b, c) {
console.log("test");
}
function test3(a, b, c = "hello") {
console.log("test");
}
function test4(a, b, c = "with, comma") {
console.log("test");
}
function test5(a, b, c = "with escaped ' quote and, comma") {
console.log("test");
}
function test6(a, b, c = "with escaped ' quote and, comma", d = 'and double " quotes, too!') {
console.log("test");
}
function test7(a, b, c = "testFuncCalls".substr(1, 2), d = "or maybe (string parenthesis)", e = Math.sqrt(Math.pow(5, 2))) {
console.log("test");
}
function test8(betterMakeSure, itWorksWith, longVariables = "too") {
console.log("test");
}
function test9(single) {
console.log("test");
}
function test10(single = "default") {
console.log("test");
}
function test11(a, b, c = { objects: true, test: "," }) {
console.log("test");
}
function test12(a, b, arrays = [true, 2, "three, "]) {
console.log("test");
}
function test13(a = "endingEmptyParenths".toString()) {
console.log("test");
}
function test14(singleInDouble = "'", b = 1) {
console.log("test");
}
function test15(doubleInSingle = '"', b = 1) {
console.log("test");
}
function test16(doubleInSingle = '"', b = 1, ...args) {
console.log("test");
}
function test17(p1, p2) {
console.log("test");
}
function test18(p1, p2 = null) {
console.log("test");
}
function test19(p1 = (a, b) => 1, p2 = null) { }
const tests = [
[test1, 0, 0],
[test2, 3, 0],
[test3, 2, 1],
[test4, 2, 1],
[test5, 2, 1],
[test6, 2, 2],
[test7, 2, 2],
[test8, 2, 1],
[test9, 1, 0],
[test10, 0, 1],
[test11, 2, 1],
[test12, 2, 1],
[test13, 0, 1],
[test14, 0, 2],
[test15, 0, 2],
[test16, 0, 3],
[test17, 2, 0],
[test18, 1, 1],
[test19, 0, 2],
];
let idx = 1;
for (const [func, s, o] of tests) {
it(`correct counting of test${idx++}`, function () {
const res = countArguments(func);
assert.equal(res.static, s, `Expecting static - parameters to ${s} to match ${res.static}`);
assert.equal(res.optional, o, `Expecting ${o} to match ${res.optional}`);
});
}
});
describe("countArguments - arrow functions", function () {
const tests = [
[/* 1*/ function empty() { }, 0],
[/* 2*/ function simple(a, b, c) { }, 3],
[/* 3*/ function withString(a, b, c = "hello") { }, 3],
[/* 4*/ function withStringAndComma(a, b, c = "with, comma") { }, 3],
[
/* 5*/ function withEscapedStuffInStringValue(a, b, c = "with escaped ' quote and, comma") { },
3,
],
[
/* 6*/ function withEscapedStuffAndCommaInStringValue(a, b, c = "with escaped ' quote and, comma", d = 'and double " quotes, too!') { },
4,
],
[
/* 7*/ function withParenthesisInStringValues(a, b, c = "testFuncCalls".slice(1, 2), d = "or maybe (string parenthesis)", e = Math.sqrt(Math.pow(5, 2))) { },
4,
],
[
/* 8*/ function (betterMakeSure, itWorksWith, longVariables = "too") { },
3,
],
[/* 9*/ function (single) { }, 1],
[/*10*/ function (single = "default") { }, 1],
[/*11*/ function (a, b, c = { objects: true, test: "," }) { }, 3],
[/*12*/ function (a, b, arrays = [true, 2, "three, "]) { }, 3],
[/*13*/ function (a = "endingEmptyParenths".toString()) { }, 1],
[/*14*/ function (singleInDouble = "'", b = 1) { }, 2],
[/*15*/ function (doubleInSingle = '"', b = 1) { }, 2],
[/*16*/ () => { }, 0],
[/*17*/ (_ = 23) => { }, 1],
[/*18*/ (a) => { }, 1],
[/*19*/ (...a) => { }, 1],
[
/*20*/ (a) => {
return a;
},
1,
],
[/*21*/ (b = 1, a = {}) => { }, 2],
[/*22*/ (b = 1, a = [1, 2, 3]) => { }, 2],
// [/*23*/ function (foo, bar) {}.bind(null), 2], // 23 }'
[/*24*/ (a) => a, 1],
[/*25*/ (b, c, a = [1, 2, 4].map((v) => "x,y")) => `hello`, 3],
[/*26*/ (_ = 42) => console.log("test"), 1],
// [
// /*27*/ (a = `\(42\)`, b = `"blablabla,\",\"foo,\",\"bar"`) =>
// console.log("test"),
// 2,
// ],
[
/*28*/ (a = `([42, 43]\``, b = `"blablabla, foo(, \`\'bar:))"`) => console.log("test"),
2,
],
[
/*29*/ (a = `\([42, 43]\)`, b = function (a, b, c = "foo, also: bar") {
let x = [a, b];
return x;
}) => console.log("test"),
2,
],
[
/*30*/ (a = {
x: 'some" comma\'s, unclosed brackets, }},[, (, and escapes and whatnot"\\',
}, b) => console.log("test"),
2,
],
];
for (const [func, all] of tests) {
it(`correct counting of: ${_extractArgumentsPartFromFunction(func)}`, function () {
const res = countArguments(func);
assert.equal(res.total, all, `Expecting static - parameters to ${all} to match ${res.total}`);
});
}
});
describe("auto-fill", function () {
function test(p1, p2, p3 = null, p4 = null) {
return [p1, p2, p3, p4];
}
const tests = [
[[0, 1], [], false, [0, 1, undefined, undefined]],
[[0, 1], [2], false, [0, 1, 2, undefined]],
[[0, 1], [3], true, [0, 1, undefined, 3]],
[[0, 1], [2, 3], false, [0, 1, 2, 3]],
[[0, 1], [2, 3], true, [0, 1, 2, 3]],
];
for (const params of tests) {
it(`auto assigning parameters of: ${params.slice(0, 3)}`, function () {
const p = fillOptionalArguments(test, params[0], params[1], params[2]);
const r = params[3];
assert.deepEqual(p, r, `Expecting static - parameters to ${p} to match ${r}`);
const res = r.map((item) => {
if (item === undefined) {
return null;
}
else
return item;
});
assert.deepEqual(test(...p), res, `Expecting the result to be equal ${p} to match ${res}`);
});
}
});
});