@flemist/test-variants 5.0.13 → 5.0.15
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.
- package/README.md +7 -3
- package/build/browser/index.cjs +1 -1
- package/build/browser/index.mjs +1 -1
- package/build/common/index.cjs +1 -1
- package/build/common/index.mjs +1 -1
- package/build/common/test-variants/-test/helpers/CallController.d.ts +1 -1
- package/build/common/test-variants/run/createRunState.d.ts +2 -0
- package/build/common/test-variants/run/errorHandlers.d.ts +1 -2
- package/build/common/test-variants/run/runIterationLoop.d.ts +1 -2
- package/build/common/test-variants/run/types.d.ts +7 -3
- package/build/common/test-variants/types.d.ts +4 -5
- package/build/createTestVariants-C2AcN9Rj.js +4 -0
- package/build/{createTestVariants-Bbto3Xye.mjs → createTestVariants-MkSgLExA.mjs} +399 -396
- package/build/node/index.cjs +1 -1
- package/build/node/index.mjs +67 -60
- package/package.json +2 -3
- package/build/createTestVariants-B34VFl9m.js +0 -4
package/build/node/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const O=require("../createTestVariants-C2AcN9Rj.js"),x=require("path"),m=require("@flemist/simple-utils"),P=require("@flemist/simple-utils/node"),b=require("fs");function E(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const g=E(x),l=E(b);async function A(e){const t=await l.promises.stat(e).catch(()=>null);if(t==null)return[];if(!t.isDirectory())throw new Error(`[saveErrorVariants] path is not a directory: ${e}`);return(await l.promises.readdir(e)).filter(s=>s.endsWith(".json")).sort((s,a)=>s>a?-1:s<a?1:0).map(s=>g.join(e,s))}async function D(e,t){const n=await l.promises.readFile(e,"utf-8");let r;try{r=JSON.parse(n)}catch{throw new Error(`[saveErrorVariants] invalid JSON in file: ${e}`)}if(t)try{return t(r)}catch{throw new Error(`[saveErrorVariants] jsonToArgs failed for file: ${e}`)}return r}function L(e){const t=Math.random().toString(36).substring(2);return m.formatDateFileName(e.sessionDate,"UTC")+"_"+t+".json"}async function N(e,t,n){let r;if(n){const s=n(e);typeof s=="string"?r=s:r=JSON.stringify(s,null,2)}else r=JSON.stringify(e,null,2);await l.promises.mkdir(g.dirname(t),{recursive:!0}),await l.promises.writeFile(t,r,"utf-8")}function k(e,t){const n=Math.max(e.length,t.length);for(let r=0;r<n;r++){const s=e[r],a=t[r];if(s==null){if(a==null)continue;return 1}if(a==null||s<a)return-1;if(s>a)return 1}return 0}class q{options;filePath;lastSavedArgs=null;constructor(t){this.options=t;const n=new Date;this.filePath=g.resolve(t.dir,t.getFilePath?.({sessionDate:n})??L({sessionDate:n}))}async save(t){m.deepEqualJsonLike(t,this.lastSavedArgs)||(this.lastSavedArgs={...t},await P.fileLock({filePath:this.filePath,func:()=>N(t,this.filePath,this.options.argsToJson)}))}async replay(t){const{testRun:n,variantsIterator:r,testOptions:s,findBestErrorEnabled:a,state:u}=t,V=this.options.useToFindBestError,S=this.options.limitArg??!1,T=this.options.extendTemplates??!1,j=this.options.attemptsPerVariant??1,w=new Map;function d(i){let o=w.get(i);return o===void 0&&(o=r.calcIndexes(i,{includeLimit:!1,limitArg:S}),w.set(i,o)),o}const y=await A(this.options.dir),f=[];for(let i=0,o=y.length;i<o;i++){const p=y[i],c=await D(p,this.options.jsonToArgs);T&&r.extendTemplates(c),d(c)!=null&&f.push(c)}function F(i,o){return k(d(i),d(o))}f.sort(F);for(let i=0,o=f.length;i<o;i++){const p=f[i];for(let c=0;c<j;c++)try{const h=u.tests;u.tests++;const v=n(p,h,s);m.isPromiseLike(v)&&await v}catch(h){if(V&&a){r.addLimit({args:p,error:h});break}throw h}}}}function _(e){return new q(e)}function I(e){const t=O.createTestVariants(e);return function(r){const s=t(r);return function(u){return s({...u,createSaveErrorVariantsStore:_})}}}exports.createTestVariants=I;
|
package/build/node/index.mjs
CHANGED
|
@@ -1,52 +1,51 @@
|
|
|
1
|
-
import { c as
|
|
1
|
+
import { c as S } from "../createTestVariants-MkSgLExA.mjs";
|
|
2
2
|
import * as d from "path";
|
|
3
|
-
import { isPromiseLike as
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const t = await f.promises.stat(r).catch(() => null);
|
|
3
|
+
import { formatDateFileName as A, deepEqualJsonLike as T, isPromiseLike as P } from "@flemist/simple-utils";
|
|
4
|
+
import { fileLock as j } from "@flemist/simple-utils/node";
|
|
5
|
+
import * as c from "fs";
|
|
6
|
+
async function L(e) {
|
|
7
|
+
const t = await c.promises.stat(e).catch(() => null);
|
|
9
8
|
if (t == null)
|
|
10
9
|
return [];
|
|
11
10
|
if (!t.isDirectory())
|
|
12
|
-
throw new Error(`[saveErrorVariants] path is not a directory: ${
|
|
13
|
-
return (await
|
|
11
|
+
throw new Error(`[saveErrorVariants] path is not a directory: ${e}`);
|
|
12
|
+
return (await c.promises.readdir(e)).filter((s) => s.endsWith(".json")).sort((s, o) => s > o ? -1 : s < o ? 1 : 0).map((s) => d.join(e, s));
|
|
14
13
|
}
|
|
15
|
-
async function
|
|
16
|
-
const n = await
|
|
17
|
-
let
|
|
14
|
+
async function N(e, t) {
|
|
15
|
+
const n = await c.promises.readFile(e, "utf-8");
|
|
16
|
+
let r;
|
|
18
17
|
try {
|
|
19
|
-
|
|
18
|
+
r = JSON.parse(n);
|
|
20
19
|
} catch {
|
|
21
|
-
throw new Error(`[saveErrorVariants] invalid JSON in file: ${
|
|
20
|
+
throw new Error(`[saveErrorVariants] invalid JSON in file: ${e}`);
|
|
22
21
|
}
|
|
23
22
|
if (t)
|
|
24
23
|
try {
|
|
25
|
-
return t(
|
|
24
|
+
return t(r);
|
|
26
25
|
} catch {
|
|
27
26
|
throw new Error(
|
|
28
|
-
`[saveErrorVariants] jsonToArgs failed for file: ${
|
|
27
|
+
`[saveErrorVariants] jsonToArgs failed for file: ${e}`
|
|
29
28
|
);
|
|
30
29
|
}
|
|
31
|
-
return
|
|
30
|
+
return r;
|
|
32
31
|
}
|
|
33
|
-
function
|
|
32
|
+
function O(e) {
|
|
34
33
|
const t = Math.random().toString(36).substring(2);
|
|
35
|
-
return
|
|
34
|
+
return A(e.sessionDate, "UTC") + "_" + t + ".json";
|
|
36
35
|
}
|
|
37
|
-
async function
|
|
38
|
-
let
|
|
36
|
+
async function k(e, t, n) {
|
|
37
|
+
let r;
|
|
39
38
|
if (n) {
|
|
40
|
-
const s = n(
|
|
41
|
-
typeof s == "string" ?
|
|
39
|
+
const s = n(e);
|
|
40
|
+
typeof s == "string" ? r = s : r = JSON.stringify(s, null, 2);
|
|
42
41
|
} else
|
|
43
|
-
|
|
44
|
-
await
|
|
42
|
+
r = JSON.stringify(e, null, 2);
|
|
43
|
+
await c.promises.mkdir(d.dirname(t), { recursive: !0 }), await c.promises.writeFile(t, r, "utf-8");
|
|
45
44
|
}
|
|
46
|
-
function
|
|
47
|
-
const n = Math.max(
|
|
48
|
-
for (let
|
|
49
|
-
const s = r
|
|
45
|
+
function D(e, t) {
|
|
46
|
+
const n = Math.max(e.length, t.length);
|
|
47
|
+
for (let r = 0; r < n; r++) {
|
|
48
|
+
const s = e[r], o = t[r];
|
|
50
49
|
if (s == null) {
|
|
51
50
|
if (o == null)
|
|
52
51
|
continue;
|
|
@@ -59,7 +58,7 @@ function O(r, t) {
|
|
|
59
58
|
}
|
|
60
59
|
return 0;
|
|
61
60
|
}
|
|
62
|
-
class
|
|
61
|
+
class I {
|
|
63
62
|
options;
|
|
64
63
|
filePath;
|
|
65
64
|
lastSavedArgs = null;
|
|
@@ -68,70 +67,78 @@ class k {
|
|
|
68
67
|
const n = /* @__PURE__ */ new Date();
|
|
69
68
|
this.filePath = d.resolve(
|
|
70
69
|
t.dir,
|
|
71
|
-
t.getFilePath?.({ sessionDate: n }) ??
|
|
70
|
+
t.getFilePath?.({ sessionDate: n }) ?? O({ sessionDate: n })
|
|
72
71
|
);
|
|
73
72
|
}
|
|
74
73
|
async save(t) {
|
|
75
|
-
|
|
74
|
+
T(t, this.lastSavedArgs) || (this.lastSavedArgs = { ...t }, await j({
|
|
76
75
|
filePath: this.filePath,
|
|
77
|
-
func: () =>
|
|
76
|
+
func: () => k(t, this.filePath, this.options.argsToJson)
|
|
78
77
|
}));
|
|
79
78
|
}
|
|
80
79
|
async replay(t) {
|
|
81
|
-
const {
|
|
80
|
+
const {
|
|
81
|
+
testRun: n,
|
|
82
|
+
variantsIterator: r,
|
|
83
|
+
testOptions: s,
|
|
84
|
+
findBestErrorEnabled: o,
|
|
85
|
+
state: f
|
|
86
|
+
} = t, v = this.options.useToFindBestError, y = this.options.limitArg ?? !1, V = this.options.extendTemplates ?? !1, x = this.options.attemptsPerVariant ?? 1, g = /* @__PURE__ */ new Map();
|
|
82
87
|
function m(i) {
|
|
83
88
|
let a = g.get(i);
|
|
84
|
-
return a === void 0 && (a =
|
|
89
|
+
return a === void 0 && (a = r.calcIndexes(i, {
|
|
85
90
|
includeLimit: !1,
|
|
86
|
-
limitArg:
|
|
91
|
+
limitArg: y
|
|
87
92
|
}), g.set(i, a)), a;
|
|
88
93
|
}
|
|
89
|
-
const w = await
|
|
94
|
+
const w = await L(this.options.dir), u = [];
|
|
90
95
|
for (let i = 0, a = w.length; i < a; i++) {
|
|
91
|
-
const h = w[i], l = await
|
|
96
|
+
const h = w[i], l = await N(
|
|
92
97
|
h,
|
|
93
98
|
this.options.jsonToArgs
|
|
94
99
|
);
|
|
95
|
-
|
|
100
|
+
V && r.extendTemplates(l), m(l) != null && u.push(l);
|
|
96
101
|
}
|
|
97
|
-
function
|
|
98
|
-
return
|
|
102
|
+
function F(i, a) {
|
|
103
|
+
return D(m(i), m(a));
|
|
99
104
|
}
|
|
100
|
-
u.sort(
|
|
105
|
+
u.sort(F);
|
|
101
106
|
for (let i = 0, a = u.length; i < a; i++) {
|
|
102
107
|
const h = u[i];
|
|
103
|
-
for (let l = 0; l <
|
|
108
|
+
for (let l = 0; l < x; l++)
|
|
104
109
|
try {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
+
const p = f.tests;
|
|
111
|
+
f.tests++;
|
|
112
|
+
const E = n(h, p, s);
|
|
113
|
+
P(E) && await E;
|
|
114
|
+
} catch (p) {
|
|
115
|
+
if (v && o) {
|
|
116
|
+
r.addLimit({
|
|
110
117
|
args: h,
|
|
111
|
-
error:
|
|
118
|
+
error: p
|
|
112
119
|
});
|
|
113
120
|
break;
|
|
114
121
|
}
|
|
115
|
-
throw
|
|
122
|
+
throw p;
|
|
116
123
|
}
|
|
117
124
|
}
|
|
118
125
|
}
|
|
119
126
|
}
|
|
120
|
-
function
|
|
121
|
-
return new
|
|
127
|
+
function J(e) {
|
|
128
|
+
return new I(e);
|
|
122
129
|
}
|
|
123
|
-
function
|
|
124
|
-
const t =
|
|
125
|
-
return function(
|
|
126
|
-
const s = t(
|
|
127
|
-
return function(
|
|
130
|
+
function M(e) {
|
|
131
|
+
const t = S(e);
|
|
132
|
+
return function(r) {
|
|
133
|
+
const s = t(r);
|
|
134
|
+
return function(f) {
|
|
128
135
|
return s({
|
|
129
|
-
...
|
|
130
|
-
createSaveErrorVariantsStore:
|
|
136
|
+
...f,
|
|
137
|
+
createSaveErrorVariantsStore: J
|
|
131
138
|
});
|
|
132
139
|
};
|
|
133
140
|
};
|
|
134
141
|
}
|
|
135
142
|
export {
|
|
136
|
-
|
|
143
|
+
M as createTestVariants
|
|
137
144
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flemist/test-variants",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.15",
|
|
4
4
|
"description": "Runs a test function with all possible combinations of its parameters.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"types": "build/common/index.d.ts",
|
|
@@ -143,8 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
"dependencies": {
|
|
145
145
|
"@flemist/abort-controller-fast": "^1.0.0",
|
|
146
|
-
"@flemist/
|
|
147
|
-
"@flemist/simple-utils": "^2.1.15",
|
|
146
|
+
"@flemist/simple-utils": "^2.2.2",
|
|
148
147
|
"@flemist/time-controller": "^1.0.4",
|
|
149
148
|
"@flemist/time-limits": "^2.0.4",
|
|
150
149
|
"tslib": ">=2.8.1"
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";const W=require("@flemist/time-controller"),z=require("@flemist/simple-utils"),E=require("@flemist/async-utils"),B=require("@flemist/abort-controller-fast"),K=require("@flemist/time-limits");class ge extends Error{}function ne(){if(typeof process<"u"&&process.memoryUsage)try{return process.memoryUsage.rss()}catch{}if(typeof performance<"u"){const e=performance.memory;if(e)try{return e.usedJSHeapSize}catch{}}return null}const Je=1e3,U=[];function Xe(e){return z.formatAny(e,{pretty:!0,maxDepth:5,maxItems:50})}function Ze(...e){const r=e.map(t=>typeof t=="string"?t:Xe(t)).join(" ");U.push(r),U.length>Je&&U.shift(),console.log(r)}function Ke(){return U.join(`
|
|
2
|
-
`)}globalThis.__getStressTestLogLast=Ke;const pe=(e,r)=>{Ze(r)},he=e=>z.formatAny(e,{pretty:!0,maxDepth:20,maxItems:100,maxStringLength:5e3,dontExpandClassInstances:!0,dontExpandFunctions:!0}),C={start:!0,progress:5e3,completed:!0,error:!0,modeChange:!0,debug:!1,func:pe,format:he},Qe={start:!1,progress:!1,completed:!1,error:!1,modeChange:!1,debug:!1,func:pe,format:he};function be(e){return e===!1?Qe:e===!0||!e?C:{start:e.start??C.start,progress:e.progress??C.progress,completed:e.completed??C.completed,error:e.error??C.error,modeChange:e.modeChange??C.modeChange,debug:e.debug??C.debug,func:e.func??C.func,format:e.format??C.format}}function Ye(e,r){const t=e.now();return{startTime:t,startMemory:r,debugMode:!1,tests:0,iterations:0,iterationsAsync:0,prevLogTime:t,prevLogMemory:r,pendingModeChange:null,prevGcTime:t,prevGcIterations:0,prevGcIterationsAsync:0}}class V extends B.AbortError{}class et{_timeController;_subject;_interval;_timer;constructor(r,t){this._interval=r,this._timeController=t??W.timeControllerDefault,this._subject=new z.Subject({startStopNotifier:()=>(this.update(),()=>{this._timeController.clearTimeout(this._timer)})})}update(){this._subject.emit(this._timeController.now()),this._timer=this._timeController.setTimeout(()=>this.update(),this._interval)}get interval(){return this._interval}set interval(r){this._interval=r,this._timer&&(this._timeController.clearTimeout(this._timer),this.update())}subscribe(r){return this._subject.subscribe(r)}}const tt=50,rt=5;function nt(e,r){return e==null?null:typeof e=="number"?e:e(r)??null}function ue(e,r){return typeof e=="number"?{iterationsAsync:0,iterationsSync:e}:e!=null&&typeof e=="object"?e:r?{iterationsAsync:1,iterationsSync:0}:{iterationsAsync:0,iterationsSync:1}}function it(e,r){const t=r.log,o=r.pauseDebuggerOnError??!0,i=r.onStart,s=r.onEnd;let n=null,a=0;function c(m,h,y){n==null&&(n={error:m,args:h,tests:y},t.error&&t.func("error",`[test-variants] error variant: ${t.format(h)}
|
|
3
|
-
tests: ${y}
|
|
4
|
-
${t.format(m)}`));const d=Date.now();if(o)debugger;if(Date.now()-d>tt&&a<rt){t.func("debug",`[test-variants] debug iteration: ${a}`),a++;return}const v=n;throw n=null,r.onError&&r.onError(v),v.error}const g=new et(100);return function(h,y,d){i&&i({args:h,tests:y});const b=nt(r.timeout,h);let v=null,M=d,f=null;b&&(v=Date.now(),f=new B.AbortControllerFast,M={abortSignal:E.combineAbortSignals(d.abortSignal,f.signal),timeController:d.timeController});function w(){f.abort(new ge(`[test-variants] test timeout ${b}ms exceeded`))}try{let S=e(h,M);if(E.isPromiseLike(S)){let T=null;return f&&(T=g.subscribe(()=>{Date.now()-v>=b&&(w(),T())}),S=Promise.race([S,E.abortSignalToPromise(f.signal)])),S.then(O=>{T?.();const G=ue(O,!0);return s&&s({args:h,tests:y,result:G}),G},O=>(T?.(),s&&!(O instanceof V)&&s({args:h,tests:y,error:O}),c(O,h,y)))}v!=null&&Date.now()-v>=b&&(w(),f.signal.throwIfAborted());const A=ue(S,!1);return s&&s({args:h,tests:y,result:A}),A}catch(S){return S instanceof V?void 0:(s&&s({args:h,tests:y,error:S}),c(S,h,y))}}}function R(e,r,t){for(let o=0,i=e.length;o<i;o++)if(t?t(e[o],r):e[o]===r)return o;return-1}function ce(e,r,t,o){const i=Object.keys(e.templates),s={},n=[],a=[],c=[],g=i.length;for(let m=0;m<g;m++){const h=i[m];s[h]=void 0,n.push(-1),a.push(void 0),c.push(null)}return{args:s,argsNames:i,indexes:n,argValues:a,argLimits:c,attempts:0,templates:e,limitArgOnError:t,equals:r,includeErrorVariant:o??!1}}function N(e,r){const t=e.templates.templates[r],o=e.templates.extra[r];let i;if(typeof t=="function"?i=t(e.args):i=t,o==null)return i;let s=null;const n=o.length;for(let a=0;a<n;a++){const c=o[a];R(i,c,e.equals)<0&&(s==null?s=[...i,c]:s.push(c))}return s??i}function I(e,r,t){const o=e.argValues[r].length;if(o===0)return-1;const i=e.argLimits[r];if(i==null)return o-1;let s=e.limitArgOnError;if(typeof s=="function"){const n=e.argsNames[r];s=s({name:n,values:e.argValues[r],maxValueIndex:i})}return!t||s?Math.min(i,o-1):o-1}function L(e){const r=e.indexes.length;for(let t=0;t<r;t++){const o=e.argLimits[t];if(o==null)return!1;const i=e.indexes[t];if(i>o)return!0;if(i<o)return!1}return!e.includeErrorVariant}function _(e){const r=e.indexes.length;for(let t=0;t<r;t++)e.indexes[t]=-1,e.argValues[t]=void 0,e.args[e.argsNames[t]]=void 0}function ye(e){let r=!1,t=!0;const o=e.indexes.length;let i=o,s=!1,n=0;for(;n<o;n++){const a=e.argValues[n]==null;(a||s)&&(a&&(r=!0),e.argValues[n]=N(e,e.argsNames[n]));const c=I(e,n,n>i);if(c<0){t=!1,e.indexes[n]=-1;break}a&&(e.indexes[n]=0,e.args[e.argsNames[n]]=e.argValues[n][0]),(s||e.indexes[n]>c)&&(e.indexes[n]=c,e.args[e.argsNames[n]]=e.argValues[n][c],s=!0),i===o&&e.indexes[n]<c&&(i=n)}if(L(e))return _(e),!1;if(r&&t)return!0;for(n--;n>=0;n--){if(e.argValues[n]==null)continue;let a=n>i;const c=I(e,n,a),g=e.indexes[n]+1;if(g<=c){e.indexes[n]=g,e.args[e.argsNames[n]]=e.argValues[n][g],g<c&&(a=!0);for(let m=n+1;m<o;m++)e.args[e.argsNames[m]]=void 0;for(n++;n<o;n++){e.argValues[n]=N(e,e.argsNames[n]);const m=I(e,n,a);if(m<0)break;e.indexes[n]=0,e.args[e.argsNames[n]]=e.argValues[n][0],m>0&&(a=!0)}if(n>=o)return L(e)?(_(e),!1):!0}}return _(e),!1}function Q(e){L(e)&&_(e);let r=!1,t=!0;const o=e.indexes.length;let i=o,s=!1,n=0;for(;n<o;n++){const a=e.argValues[n]==null;(a||s)&&(a&&(r=!0),e.argValues[n]=N(e,e.argsNames[n]));const c=I(e,n,n>i);if(c<0){t=!1,e.indexes[n]=-1;break}a&&(e.indexes[n]=c,e.args[e.argsNames[n]]=e.argValues[n][c]),(s||e.indexes[n]>c)&&(e.indexes[n]=c,e.args[e.argsNames[n]]=e.argValues[n][c],s=!0),i===o&&e.indexes[n]<c&&(i=n)}if((r||s)&&t&&!L(e))return!0;for(n--;n>=0;n--){if(e.argValues[n]==null)continue;let a=n>i;const c=I(e,n,a);let g=e.indexes[n]-1;if(g>c&&(g=c),g>=0){e.indexes[n]=g,e.args[e.argsNames[n]]=e.argValues[n][g],g<c&&(a=!0);for(let m=n+1;m<o;m++)e.args[e.argsNames[m]]=void 0;for(n++;n<o;n++){e.argValues[n]=N(e,e.argsNames[n]);const m=I(e,n,a);if(m<0)break;e.indexes[n]=m,e.args[e.argsNames[n]]=e.argValues[n][m],m>0&&(a=!0)}if(n>=o)return!0}}return _(e),!1}function ot(e,r){_(e);const t=e.argsNames,o=t.length;let i=!1;for(let s=0;s<o;s++){const n=t[s],a=r[n];if(a===void 0)return null;e.argValues[s]=N(e,n);const c=I(e,s,i);if(c<0)return null;const g=R(e.argValues[s],a,e.equals);if(g<0||g>c)return null;e.indexes[s]=g,e.args[e.argsNames[s]]=e.argValues[s][g],e.indexes[s]<c&&(i=!0)}return L(e)?null:e.indexes.slice()}function st(e){const r=e.indexes.length;if(r===0)return!1;let t=!1;for(let o=0;o<r;o++){e.argValues[o]=N(e,e.argsNames[o]);const i=I(e,o,t);if(i<0)return Math.random()<.5?ye(e):Q(e);e.indexes[o]=Math.floor(Math.random()*(i+1)),e.args[e.argsNames[o]]=e.argValues[o][e.indexes[o]],e.indexes[o]<i&&(t=!0)}return L(e)?Q(e):!0}function k(e){return e.mode==="forward"||e.mode==="backward"}function lt(e,r,t,o){const i=r[t],s=e.templates[t];if(typeof s!="function"){if(R(s,i,o)>=0)return;s.push(i);return}const n=e.extra[t];if(n==null){e.extra[t]=[i];return}R(n,i,o)>=0||n.push(i)}function at(e,r,t){for(const o in r)if(Object.prototype.hasOwnProperty.call(r,o)){if(o==="seed")continue;lt(e,r,o,t)}}function fe(e,r){for(const t in r)if(Object.prototype.hasOwnProperty.call(r,t)){if(t==="seed")continue;if(!e[t])return!1}return!0}const ut=[{mode:"forward"}];function ct(e){const{argsTemplates:r,equals:t,limitArgOnError:o,includeErrorVariant:i,getSeed:s,iterationModes:n,onModeChange:a,limitCompletionCount:c,limitTests:g,limitTime:m}=e,h=e.timeController??W.timeControllerDefault,y={templates:z.deepCloneJsonLike(r),extra:{}},d=n==null||n.length===0?ut:n,b=[];let v=null,M=null,f=0,w=0,S=!1,A=0;function T(){S||(S=!0,A=h.now(),O(),f=0,se(),xe())}function O(){for(let l=0,u=d.length;l<u;l++)b.push(G())}function G(){return{navigationState:ce(y,t??null,o??null,i??null),cycleCount:0,completedCount:0,testsInLastTurn:0,tryNextVariantAttempts:0,startTime:null}}function xe(){v=ce(y,t??null,!1,!1)}function se(){a?.({mode:d[f],modeIndex:f,tests:w})}function Te(l){T(),fe(y.templates,l)&&at(y,l,t)}function le(l,u){return T(),fe(y.templates,l)?(v.limitArgOnError=u?.limitArg??o??null,v.includeErrorVariant=u?.includeLimit??i??!1,ot(v,l)):null}function Ce(l){const u=l?.args;if(u==null)return;T();const p=le(u);if(p!=null){M={args:u,error:l?.error,tests:l?.tests??w},v.argLimits=p;for(let x=0,q=b.length;x<q;x++){const X=b[x].navigationState;X.argLimits=p}}}function Me(){return T(),Ie()}function Ie(){for(;;){if(!Ve())return null;for(;;){const l=qe();if(l!=null)return b[f].testsInLastTurn++,w++,l;if(Ne()){if(!$e())return null;De();break}}}}function Ve(){return!(Ae()||Oe()||D()&&(Le()||!Pe())||!_e())}function Ae(){return g!=null&&w>=g}function Oe(){return m!=null&&h.now()-A>=m}function Le(){if(!D())throw new Error("Unexpected behavior");return c!=null&&c<=0}function Pe(){if(!D())throw new Error("Unexpected behavior");for(let l=0,u=d.length;l<u;l++)if(P(d[l])&&H(l))return!0;return!1}function _e(){for(let l=0,u=d.length;l<u;l++)if(H(l))return!0;return!1}function Ne(){f++;const l=f>=d.length;return l&&(f=0),se(),l}function $e(){if(D()){const l=Ge();if(c!=null&&l>=c)return!1}return!0}function D(){for(let l=0,u=d.length;l<u;l++)if(k(d[l]))return!0;return!1}function Ge(){let l=!1,u=1/0;for(let p=0,x=b.length;p<x;p++){const q=b[p],X=d[p];k(X)&&(l=!0,H(p)&&q.completedCount<u&&(u=q.completedCount))}if(!l)throw new Error("Unexpected behavior");return u}function H(l){const u=d[l],p=b[l];return u.limitTests!=null&&u.limitTests<=0||P(u)&&(u.cycles!=null&&u.cycles<=0||u.attemptsPerVariant!=null&&u.attemptsPerVariant<=0)?!1:p.tryNextVariantAttempts<2}function De(){f=0;for(let l=0,u=b.length;l<u;l++){const p=b[l];p.testsInLastTurn=0,p.startTime=null}}function qe(){let l=0;for(;l<2;){if(!ke())return null;const u=je();if(u!=null)return u;if(P(d[f])&&Fe())return null;l++}return null}function ke(){const l=d[f];return!(Ue()||Be()||P(l)&&!Re(f))}function Ue(){const l=d[f],u=b[f];return l.limitTests!=null&&u.testsInLastTurn>=l.limitTests}function Be(){const l=d[f],u=b[f];return l.limitTime!=null&&u.startTime!=null&&h.now()-u.startTime>=l.limitTime}function P(l){return k(l)}function Re(l){const u=d[l],p=b[l];if(!P(u))throw new Error("Unexpected behavior");return p.cycleCount<(u.cycles??1)}function Fe(){const l=d[f],u=b[f];if(!P(l))throw new Error("Unexpected behavior");return u.cycleCount++,u.cycleCount>=(l.cycles??1)?(u.cycleCount=0,u.completedCount++,!0):!1}function je(){const l=d[f],u=b[f],p=u.navigationState;if($(l)){if(J())return null;const x=We();if(x!=null)return u.startTime==null&&(u.startTime=h.now()),x}return He()?(u.tryNextVariantAttempts=0,$(l)&&ze(),u.startTime==null&&(u.startTime=h.now()),ae(p.args)):(u.tryNextVariantAttempts++,null)}function We(){const l=d[f],p=b[f].navigationState;if(!$(l))throw new Error("Unexpected behavior");if(J())throw new Error("Unexpected behavior");const x=l.attemptsPerVariant??1;return p.attempts>0&&p.attempts<x?L(p)?null:(p.attempts++,ae(p.args)):null}function ze(){const l=d[f],p=b[f].navigationState;if(!$(l))throw new Error("Unexpected behavior");if(J())throw new Error("Unexpected behavior");p.attempts=1}function $(l){return k(l)}function J(){const l=d[f];if(!$(l))throw new Error("Unexpected behavior");return(l.attemptsPerVariant??1)<=0}function He(){const l=d[f],p=b[f].navigationState;switch(l.mode){case"forward":return ye(p);case"backward":return Q(p);case"random":return st(p);default:throw new Error(`Unknown mode: ${l.mode}`)}}function ae(l){const u={...l};return s!=null&&(u.seed=s({tests:w})),u}return{get limit(){return M},get modeIndex(){return f},get modeConfigs(){return d},get modeStates(){return b},get tests(){return w},calcIndexes:le,extendTemplates:Te,addLimit:Ce,next:Me}}function ie(e){if(e==null||e<=0)throw new Error(`Iterations = ${e}`);e--;const r=E.waitMicrotasks().then(()=>e);return e<=0?r:r.then(ie)}function ft(e,r,t){const o=r.limit?{error:r.limit.error,args:r.limit.args,tests:r.limit.tests}:null;if(o&&!t)throw o.error;return{iterations:e.iterations,bestError:o}}const me=2**31;function mt(e){if(e==null)return{parallel:1,sequentialOnError:!1};if(typeof e=="boolean")return{parallel:e?me:1,sequentialOnError:!1};if(typeof e=="number")return{parallel:e>0?e:1,sequentialOnError:!1};const r=e.count;let t=1;return r===!0?t=me:typeof r=="number"&&r>0&&(t=r),{parallel:t,sequentialOnError:e.sequentialOnError??!1}}function dt(e){const r=e?.saveErrorVariants,t=r&&e.createSaveErrorVariantsStore?e.createSaveErrorVariantsStore(r):null,o=e?.findBestError,{parallel:i,sequentialOnError:s}=mt(e?.parallel);return{store:t,GC_Iterations:e?.GC_Iterations??1e6,GC_IterationsAsync:e?.GC_IterationsAsync??1e4,GC_Interval:e?.GC_Interval??1e3,logOptions:be(e?.log),abortSignalExternal:e?.abortSignal,findBestError:o,dontThrowIfError:o?.dontThrowIfError,timeController:e?.timeController??W.timeControllerDefault,parallel:i,sequentialOnError:s}}function F(e,r,t){const{options:o,variantsIterator:i}=e,s=i.limit?.args??r;if(!o.store)return;const n=o.store.save(s);if(t)return n}function gt(e,r,t,o){const{abortControllerParallel:i,state:s,options:n}=e,{logOptions:a}=n;if(e.options.findBestError)e.variantsIterator.addLimit({args:r,error:t,tests:o}),s.debugMode=!1,F(e,r,!1),n.sequentialOnError&&!i.signal.aborted?(a.debug&&a.func("debug","[test-variants] sequentialOnError: aborting parallel, switching to sequential"),i.abort(new V)):a.debug&&a.func("debug","[test-variants] parallel error in findBestError mode, continuing with new limits");else{if(i.signal.aborted)return;F(e,r,!1),i.abort(t)}}function de(e,r,t,o){const{state:i}=e;if(e.options.findBestError){e.variantsIterator.addLimit({args:r,error:t,tests:o});const n=F(e,r,!0);if(n)return n.then(()=>{i.debugMode=!1});i.debugMode=!1;return}const s=F(e,r,!0);if(s)return s.then(()=>{throw t});throw t}function pt(e,r){const{GC_Iterations:t,GC_IterationsAsync:o,GC_Interval:i}=e.options;return t>0&&e.state.iterations-e.state.prevGcIterations>=t||o>0&&e.state.iterationsAsync-e.state.prevGcIterationsAsync>=o||i>0&&r-e.state.prevGcTime>=i}async function ht(e,r){e.prevGcIterations=e.iterations,e.prevGcIterationsAsync=e.iterationsAsync,e.prevGcTime=r,await ie(1)}function oe(e){const r=e/1e3;if(r<60)return`${r.toFixed(1)}s`;const t=r/60;return t<60?`${t.toFixed(1)}m`:`${(t/60).toFixed(1)}h`}function Y(e){const r=e/1073741824;if(r>=1)return r>=10?`${Math.round(r)}GB`:`${r.toFixed(1)}GB`;const t=e/(1024*1024);return t>=10?`${Math.round(t)}MB`:`${t.toFixed(1)}MB`}function bt(e,r){if(!e)return`mode[${r}]: null`;let t=`mode[${r}]: ${e.mode}`;return(e.mode==="forward"||e.mode==="backward")&&(e.cycles!=null&&(t+=`, cycles=${e.cycles}`),e.attemptsPerVariant!=null&&(t+=`, attempts=${e.attemptsPerVariant}`)),e.limitTime!=null&&(t+=`, limitTime=${oe(e.limitTime)}`),e.limitTests!=null&&(t+=`, limitTests=${e.limitTests}`),t}function ve(e,r){const t=e-r,o=t>=0?"+":"";return`${Y(e)} (${o}${Y(t)})`}function yt(e,r){if(!e.start)return;let t="[test-variants] start";r!=null&&(t+=`, memory: ${Y(r)}`),e.func("start",t)}function vt(e){const{options:r,state:t}=e,{logOptions:o,timeController:i}=r;if(!o.completed)return;const s=i.now()-t.startTime;let n=`[test-variants] end, tests: ${t.tests} (${oe(s)}), async: ${t.iterationsAsync}`;if(t.startMemory!=null){const a=ne();a!=null&&(n+=`, memory: ${ve(a,t.startMemory)}`)}o.func("completed",n)}function Se(e){const{options:r,state:t}=e,{logOptions:o}=r,i=t.pendingModeChange;!o.modeChange||i==null||(o.func("modeChange",`[test-variants] ${bt(i.mode,i.modeIndex)}`),t.pendingModeChange=null)}function St(e){const{options:r,state:t}=e,{logOptions:o,timeController:i}=r,s=i.now();if(!o.progress||s-t.prevLogTime<o.progress)return!1;Se(e);const n=s-t.startTime;let a=`[test-variants] tests: ${t.tests} (${oe(n)}), async: ${t.iterationsAsync}`;if(t.prevLogMemory!=null){const c=ne();c!=null&&(a+=`, memory: ${ve(c,t.prevLogMemory)}`,t.prevLogMemory=c)}return o.func("progress",a),t.prevLogTime=s,!0}function ee(e,r){e.debugMode=!1,r&&(e.iterationsAsync+=r.iterationsAsync,e.iterations+=r.iterationsSync+r.iterationsAsync)}function te(e){e.state.debugMode=!0,e.abortControllerParallel.abort(new V)}function Ee(e,r){const{testRun:t,testOptions:o,state:i}=e,s=i.tests;i.tests++;try{const n=t(r,s,o);if(E.isPromiseLike(n))return n.then(a=>{if(!a){te(e);return}ee(i,a)},a=>de(e,r,a,s));if(!n){te(e);return}ee(i,n)}catch(n){return n instanceof V?void 0:de(e,r,n,s)}}function Et(e,r){const{pool:t,abortSignal:o,testRun:i,testOptionsParallel:s,state:n}=e;if(!t)return;const a=n.tests;n.tests++,(async()=>{try{if(o.aborted)return;let c=i(r,a,s);if(E.isPromiseLike(c)&&(c=await c),!c){te(e);return}ee(n,c)}catch(c){if(c instanceof V)return;gt(e,r,c,a)}finally{t.release(1)}})()}function we(e){const{options:r,state:t}=e,{logOptions:o,timeController:i,GC_Interval:s}=r;if(!o.progress&&!s)return;St(e);const n=i.now();if(pt(e,n))return ht(t,n)}function j(e){return e.options.abortSignalExternal?.aborted??!1}function re(e){return e.abortSignal.aborted}async function Z(e,r){const{pool:t,state:o,options:i}=e,{parallel:s,logOptions:n}=i;let a=null;for(;!j(e);){const c=t&&!re(e);let g=!1;c&&(t.hold(1)||await K.poolWait({pool:t,count:1,hold:!0}),g=!0);try{if(r!=null?(a=r,r=null):e.state.debugMode||(a=e.variantsIterator.next()),a==null)break;const m=we(e);if(E.isPromiseLike(m)&&await m,j(e))continue;if(c)Et(e,a),g=!1;else{n.debug&&t&&re(e)&&n.func("debug",`[test-variants] parallel aborted, running sequential: tests=${o.tests}`);const h=Ee(e,a);E.isPromiseLike(h)&&await h}}finally{g&&t.release(1)}}t&&(await K.poolWait({pool:t,count:s,hold:!0}),t.release(s))}function wt(e){const{pool:r,state:t,options:o}=e,{logOptions:i}=o;if(r)return Z(e);let s=null;for(;!j(e)&&(e.state.debugMode||(s=e.variantsIterator.next()),s!=null);){const n=we(e);if(E.isPromiseLike(n))return n.then(()=>Z(e,s));if(j(e))continue;i.debug&&re(e)&&i.func("debug",`[test-variants] parallel aborted, running sequential: tests=${t.tests}`);const a=Ee(e,s);if(E.isPromiseLike(a))return a.then(()=>Z(e))}}async function xt(e,r,t,o){const i=dt(o),{store:s,logOptions:n,abortSignalExternal:a,findBestError:c,dontThrowIfError:g,timeController:m,parallel:h}=i,y=new B.AbortControllerFast,d=new B.AbortControllerFast,b=E.combineAbortSignals(a,y.signal),v=E.combineAbortSignals(b,d.signal),M={abortSignal:b,timeController:m},f={abortSignal:v,timeController:m};s&&await s.replay({testRun:e,variantsIterator:r,testOptions:M,findBestErrorEnabled:!!c});const w=h<=1?null:new K.Pool(h);yt(n,t.startMemory);const S={options:i,testRun:e,variantsIterator:r,testOptions:M,testOptionsParallel:f,abortControllerGlobal:y,abortControllerParallel:d,abortSignal:v,pool:w,state:t};Se(S);try{await wt(S),v.throwIfAborted()}catch(A){throw y.abort(new V),A}return b.throwIfAborted(),y.abort(new V),vt(S),await ie(1),ft(t,r,g)}function Tt(e){return function(t){return async function(i){const s=be(i?.log),n=it(e,{onStart:i?.onStart,onEnd:i?.onEnd,onError:i?.onError,log:s,pauseDebuggerOnError:i?.pauseDebuggerOnError,timeout:i?.timeout}),a=i?.timeController??W.timeControllerDefault,c=ne(),g=Ye(a,c),m=i?.onModeChange;function h(d){g.pendingModeChange=d,m?.(d)}const y=ct({argsTemplates:t,getSeed:i?.getSeed,iterationModes:i?.iterationModes,equals:i?.findBestError?.equals,limitArgOnError:i?.findBestError?.limitArgOnError,includeErrorVariant:i?.findBestError?.includeErrorVariant,timeController:a,onModeChange:h,limitCompletionCount:i?.cycles??1,limitTests:i?.limitTests,limitTime:i?.limitTime});return xt(n,y,g,i)}}}exports.TimeoutError=ge;exports.createTestVariants=Tt;
|