@flemist/test-variants 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-shadow */
|
|
4
|
+
function _createTestVariants(test, sync) {
|
|
5
|
+
return function _testVariants(args) {
|
|
6
|
+
const argsKeys = Object.keys(args);
|
|
7
|
+
const argsValues = Object.values(args);
|
|
8
|
+
const argsLength = argsKeys.length;
|
|
9
|
+
const variantArgs = {};
|
|
10
|
+
function getArgValues(nArg) {
|
|
11
|
+
let argValues = argsValues[nArg];
|
|
12
|
+
if (typeof argValues === 'function') {
|
|
13
|
+
argValues = argValues(variantArgs);
|
|
14
|
+
}
|
|
15
|
+
return argValues;
|
|
16
|
+
}
|
|
17
|
+
const indexes = [];
|
|
18
|
+
const values = [];
|
|
19
|
+
for (let nArg = 0; nArg < argsLength; nArg++) {
|
|
20
|
+
indexes[nArg] = -1;
|
|
21
|
+
values[nArg] = [];
|
|
22
|
+
}
|
|
23
|
+
values[0] = getArgValues(0);
|
|
24
|
+
function nextVariant() {
|
|
25
|
+
for (let nArg = argsLength - 1; nArg >= 0; nArg--) {
|
|
26
|
+
const index = indexes[nArg] + 1;
|
|
27
|
+
if (index < values[nArg].length) {
|
|
28
|
+
indexes[nArg] = index;
|
|
29
|
+
variantArgs[argsKeys[nArg]] = values[nArg][index];
|
|
30
|
+
for (nArg++; nArg < argsLength; nArg++) {
|
|
31
|
+
const argValues = getArgValues(nArg);
|
|
32
|
+
if (argValues.length === 0) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
indexes[nArg] = 0;
|
|
36
|
+
values[nArg] = argValues;
|
|
37
|
+
variantArgs[argsKeys[nArg]] = argValues[0];
|
|
38
|
+
}
|
|
39
|
+
if (nArg >= argsLength) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
let iteration = 0;
|
|
47
|
+
let debug = false;
|
|
48
|
+
let debugIteration = 0;
|
|
49
|
+
function onError(err) {
|
|
50
|
+
console.error(JSON.stringify(variantArgs, null, 2));
|
|
51
|
+
console.error(err);
|
|
52
|
+
// rerun failed variant 5 times for debug
|
|
53
|
+
const time0 = Date.now();
|
|
54
|
+
// eslint-disable-next-line no-debugger
|
|
55
|
+
debugger;
|
|
56
|
+
if (Date.now() - time0 > 5 && debugIteration < 5) {
|
|
57
|
+
debug = true;
|
|
58
|
+
next();
|
|
59
|
+
debugIteration++;
|
|
60
|
+
}
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
function next() {
|
|
64
|
+
while (debug || nextVariant()) {
|
|
65
|
+
try {
|
|
66
|
+
iteration++;
|
|
67
|
+
const promise = test(variantArgs);
|
|
68
|
+
if (promise && typeof promise.then === 'function') {
|
|
69
|
+
if (sync) {
|
|
70
|
+
onError(new Error('Unexpected Promise result for sync test function'));
|
|
71
|
+
}
|
|
72
|
+
return promise.then(next).catch(onError);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
onError(err);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return iteration;
|
|
80
|
+
}
|
|
81
|
+
return next();
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function createTestVariantsSync(test) {
|
|
85
|
+
return _createTestVariants(test, true);
|
|
86
|
+
}
|
|
87
|
+
function createTestVariants(test) {
|
|
88
|
+
return _createTestVariants(test, false);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
exports.createTestVariants = createTestVariants;
|
|
92
|
+
exports.createTestVariantsSync = createTestVariantsSync;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function delay(milliseconds, abortSignal) {
|
|
4
|
+
return new Promise(resolve => {
|
|
5
|
+
if (abortSignal && abortSignal.aborted) {
|
|
6
|
+
resolve();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const timer = setTimeout(resolve, milliseconds);
|
|
10
|
+
if (abortSignal) {
|
|
11
|
+
abortSignal.addEventListener('abort', () => {
|
|
12
|
+
clearTimeout(timer);
|
|
13
|
+
resolve();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
exports.delay = delay;
|
package/dist/node/index.cjs
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var createTestVariants = require('./createTestVariants.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
exports.createTestVariants =
|
|
10
|
-
exports.createTestVariantsSync =
|
|
9
|
+
exports.createTestVariants = createTestVariants.createTestVariants;
|
|
10
|
+
exports.createTestVariantsSync = createTestVariants.createTestVariantsSync;
|
|
@@ -2,93 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
function _createTestVariants(test, sync) {
|
|
7
|
-
return function _testVariants(args) {
|
|
8
|
-
const argsKeys = Object.keys(args);
|
|
9
|
-
const argsValues = Object.values(args);
|
|
10
|
-
const argsLength = argsKeys.length;
|
|
11
|
-
const variantArgs = {};
|
|
12
|
-
function getArgValues(nArg) {
|
|
13
|
-
let argValues = argsValues[nArg];
|
|
14
|
-
if (typeof argValues === 'function') {
|
|
15
|
-
argValues = argValues(variantArgs);
|
|
16
|
-
}
|
|
17
|
-
return argValues;
|
|
18
|
-
}
|
|
19
|
-
const indexes = [];
|
|
20
|
-
const values = [];
|
|
21
|
-
for (let nArg = 0; nArg < argsLength; nArg++) {
|
|
22
|
-
indexes[nArg] = -1;
|
|
23
|
-
values[nArg] = [];
|
|
24
|
-
}
|
|
25
|
-
values[0] = getArgValues(0);
|
|
26
|
-
function nextVariant() {
|
|
27
|
-
for (let nArg = argsLength - 1; nArg >= 0; nArg--) {
|
|
28
|
-
const index = indexes[nArg] + 1;
|
|
29
|
-
if (index < values[nArg].length) {
|
|
30
|
-
indexes[nArg] = index;
|
|
31
|
-
variantArgs[argsKeys[nArg]] = values[nArg][index];
|
|
32
|
-
for (nArg++; nArg < argsLength; nArg++) {
|
|
33
|
-
const argValues = getArgValues(nArg);
|
|
34
|
-
if (argValues.length === 0) {
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
indexes[nArg] = 0;
|
|
38
|
-
values[nArg] = argValues;
|
|
39
|
-
variantArgs[argsKeys[nArg]] = argValues[0];
|
|
40
|
-
}
|
|
41
|
-
if (nArg >= argsLength) {
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
let iteration = 0;
|
|
49
|
-
let debug = false;
|
|
50
|
-
let debugIteration = 0;
|
|
51
|
-
function onError(err) {
|
|
52
|
-
console.error(JSON.stringify(variantArgs, null, 2));
|
|
53
|
-
console.error(err);
|
|
54
|
-
// rerun failed variant 5 times for debug
|
|
55
|
-
const time0 = Date.now();
|
|
56
|
-
// eslint-disable-next-line no-debugger
|
|
57
|
-
debugger;
|
|
58
|
-
if (Date.now() - time0 > 5 && debugIteration < 5) {
|
|
59
|
-
debug = true;
|
|
60
|
-
next();
|
|
61
|
-
debugIteration++;
|
|
62
|
-
}
|
|
63
|
-
throw err;
|
|
64
|
-
}
|
|
65
|
-
function next() {
|
|
66
|
-
while (debug || nextVariant()) {
|
|
67
|
-
try {
|
|
68
|
-
iteration++;
|
|
69
|
-
const promise = test(variantArgs);
|
|
70
|
-
if (promise && typeof promise.then === 'function') {
|
|
71
|
-
if (sync) {
|
|
72
|
-
onError(new Error('Unexpected Promise result for sync test function'));
|
|
73
|
-
}
|
|
74
|
-
return promise.then(next).catch(onError);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
onError(err);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return iteration;
|
|
82
|
-
}
|
|
83
|
-
return next();
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
function createTestVariantsSync(test) {
|
|
87
|
-
return _createTestVariants(test, true);
|
|
88
|
-
}
|
|
89
|
-
function createTestVariants(test) {
|
|
90
|
-
return _createTestVariants(test, false);
|
|
91
|
-
}
|
|
5
|
+
var createTestVariants = require('../createTestVariants.cjs');
|
|
92
6
|
|
|
93
|
-
|
|
94
|
-
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.createTestVariants = createTestVariants.createTestVariants;
|
|
10
|
+
exports.createTestVariantsSync = createTestVariants.createTestVariantsSync;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var rdtsc = require('rdtsc');
|
|
4
|
-
var
|
|
4
|
+
var createTestVariants = require('../createTestVariants.cjs');
|
|
5
5
|
|
|
6
6
|
describe('test > testVariants perf', function () {
|
|
7
7
|
this.timeout(300000);
|
|
8
8
|
it('sync/async', function () {
|
|
9
|
-
const testVariantsAsync =
|
|
9
|
+
const testVariantsAsync = createTestVariants.createTestVariants(({ a, b, c }) => {
|
|
10
10
|
});
|
|
11
|
-
const testVariantsSync =
|
|
11
|
+
const testVariantsSync = createTestVariants.createTestVariantsSync(({ a, b, c }) => {
|
|
12
12
|
});
|
|
13
13
|
const args = {
|
|
14
14
|
a: [1, 2],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flemist/test-variants",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Runs a test function with all possible combinations of its parameters.",
|
|
5
5
|
"main": "dist/node/index.cjs",
|
|
6
6
|
"types": "dist/node/index.d.ts",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"@flemist/karma-custom-launcher": "^0.0.0",
|
|
43
43
|
"@rollup/plugin-alias": "^3.1.9",
|
|
44
44
|
"@rollup/plugin-babel": "^5.3.1",
|
|
45
|
-
"@rollup/plugin-commonjs": "^
|
|
45
|
+
"@rollup/plugin-commonjs": "^22.0.0",
|
|
46
46
|
"@rollup/plugin-inject": "^4.0.4",
|
|
47
47
|
"@rollup/plugin-json": "^4.1.0",
|
|
48
48
|
"@rollup/plugin-multi-entry": "^4.1.0",
|
|
@@ -52,10 +52,10 @@
|
|
|
52
52
|
"@types/assert": "^1.5.6",
|
|
53
53
|
"@types/fs-extra": "^9.0.13",
|
|
54
54
|
"@types/mocha": "^9.1.1",
|
|
55
|
-
"@types/node": "^
|
|
55
|
+
"@types/node": "^18.0.0",
|
|
56
56
|
"cpy-cli": "^4.1.0",
|
|
57
57
|
"eslint": "^8.17.0",
|
|
58
|
-
"eslint-config-pro": "^3.0.
|
|
58
|
+
"eslint-config-pro": "^3.0.12",
|
|
59
59
|
"fs-extra": "^10.1.0",
|
|
60
60
|
"globby": "^11.1.0",
|
|
61
61
|
"karma": "^6.4.0",
|