@flemist/test-variants 5.0.3 → 5.0.5
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 +4 -0
- 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/run/types.d.ts +2 -0
- package/build/common/test-variants/types.d.ts +2 -0
- package/build/{createTestVariants-BaW2oQ-k.mjs → createTestVariants-BXmWQaT8.mjs} +366 -373
- package/build/createTestVariants-BYmqvvhv.js +4 -0
- package/build/node/index.cjs +1 -1
- package/build/node/index.mjs +1 -1
- package/package.json +35 -32
- package/build/createTestVariants-LuHR6HJQ.js +0 -4
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";const ee=require("@flemist/time-controller"),k=require("@flemist/simple-utils"),E=require("@flemist/async-utils"),H=require("@flemist/abort-controller-fast"),J=require("@flemist/time-limits");function te(){if(typeof process<"u"&&process.memoryUsage)try{return process.memoryUsage().heapUsed}catch{}if(typeof performance<"u"){const e=performance.memory;if(e)try{return e.usedJSHeapSize}catch{}}return null}const ze=1e3,_=[];function He(e){return k.formatAny(e,{pretty:!0,maxDepth:5,maxItems:50})}function Je(...e){const n=e.map(t=>typeof t=="string"?t:He(t)).join(" ");_.push(n),_.length>ze&&_.shift(),console.log(n)}function Xe(){return _.join(`
|
|
2
|
+
`)}globalThis.__getStressTestLogLast=Xe;const de=(e,n)=>{Je(n)},x={start:!0,progress:5e3,completed:!0,error:!0,modeChange:!0,debug:!1,func:de},Ze={start:!1,progress:!1,completed:!1,error:!1,modeChange:!1,debug:!1,func:de};function me(e){return e===!1?Ze:e===!0||!e?x:{start:e.start??x.start,progress:e.progress??x.progress,completed:e.completed??x.completed,error:e.error??x.error,modeChange:e.modeChange??x.modeChange,debug:e.debug??x.debug,func:e.func??x.func}}function Ke(e,n){const t=e.now();return{startTime:t,startMemory:n,debugMode:!1,tests:0,iterations:0,iterationsAsync:0,prevLogTime:t,prevLogMemory:n,pendingModeChange:null,prevGcTime:t,prevGcIterations:0,prevGcIterationsAsync:0}}class T extends H.AbortError{}const Qe=50,Ye=5;function le(e,n){return typeof e=="number"?{iterationsAsync:0,iterationsSync:e}:e!=null&&typeof e=="object"?e:n?{iterationsAsync:1,iterationsSync:0}:{iterationsAsync:0,iterationsSync:1}}function et(e,n){const t=n.log,o=n.pauseDebuggerOnError??!0;let i=null,l=0;function r(a,u,f){i==null&&(i={error:a,args:u,tests:f},t.error&&t.func("error",`[test-variants] error variant: ${k.formatAny(u,{pretty:!0})}
|
|
3
|
+
tests: ${f}
|
|
4
|
+
${k.formatAny(a)}`));const d=Date.now();if(o&&Function("debugger")(),Date.now()-d>Qe&&l<Ye){t.func("debug",`[test-variants] debug iteration: ${l}`),l++;return}const y=i;throw i=null,n.onError&&n.onError(y),y.error}return function(u,f,d){try{const h=e(u,d);return E.isPromiseLike(h)?h.then(y=>le(y,!0),y=>r(y,u,f)):le(h,!1)}catch(h){return h instanceof T?void 0:r(h,u,f)}}}function U(e,n,t){for(let o=0,i=e.length;o<i;o++)if(t?t(e[o],n):e[o]===n)return o;return-1}function ae(e,n,t,o){const i=Object.keys(e.templates),l={},r=[],a=[],u=[],f=i.length;for(let d=0;d<f;d++){const h=i[d];l[h]=void 0,r.push(-1),a.push(void 0),u.push(null)}return{args:l,argsNames:i,indexes:r,argValues:a,argLimits:u,attempts:0,templates:e,limitArgOnError:t,equals:n,includeErrorVariant:o??!1}}function O(e,n){const t=e.templates.templates[n],o=e.templates.extra[n];let i;if(typeof t=="function"?i=t(e.args):i=t,o==null)return i;let l=null;const r=o.length;for(let a=0;a<r;a++){const u=o[a];U(i,u,e.equals)<0&&(l==null?l=[...i,u]:l.push(u))}return l??i}function M(e,n,t){const o=e.argValues[n].length;if(o===0)return-1;const i=e.argLimits[n];if(i==null)return o-1;let l=e.limitArgOnError;if(typeof l=="function"){const r=e.argsNames[n];l=l({name:r,values:e.argValues[n],maxValueIndex:i})}return!t||l?Math.min(i,o-1):o-1}function V(e){const n=e.indexes.length;for(let t=0;t<n;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 C(e){const n=e.indexes.length;for(let t=0;t<n;t++)e.indexes[t]=-1,e.argValues[t]=void 0,e.args[e.argsNames[t]]=void 0}function ge(e){let n=!1,t=!0;const o=e.indexes.length;let i=o,l=!1,r=0;for(;r<o;r++){const a=e.argValues[r]==null;(a||l)&&(a&&(n=!0),e.argValues[r]=O(e,e.argsNames[r]));const u=M(e,r,r>i);if(u<0){t=!1,e.indexes[r]=-1;break}a&&(e.indexes[r]=0,e.args[e.argsNames[r]]=e.argValues[r][0]),(l||e.indexes[r]>u)&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u],l=!0),i===o&&e.indexes[r]<u&&(i=r)}if(V(e))return C(e),!1;if(n&&t)return!0;for(r--;r>=0;r--){if(e.argValues[r]==null)continue;let a=r>i;const u=M(e,r,a),f=e.indexes[r]+1;if(f<=u){e.indexes[r]=f,e.args[e.argsNames[r]]=e.argValues[r][f],f<u&&(a=!0);for(let d=r+1;d<o;d++)e.args[e.argsNames[d]]=void 0;for(r++;r<o;r++){e.argValues[r]=O(e,e.argsNames[r]);const d=M(e,r,a);if(d<0)break;e.indexes[r]=0,e.args[e.argsNames[r]]=e.argValues[r][0],d>0&&(a=!0)}if(r>=o)return V(e)?(C(e),!1):!0}}return C(e),!1}function X(e){V(e)&&C(e);let n=!1,t=!0;const o=e.indexes.length;let i=o,l=!1,r=0;for(;r<o;r++){const a=e.argValues[r]==null;(a||l)&&(a&&(n=!0),e.argValues[r]=O(e,e.argsNames[r]));const u=M(e,r,r>i);if(u<0){t=!1,e.indexes[r]=-1;break}a&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u]),(l||e.indexes[r]>u)&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u],l=!0),i===o&&e.indexes[r]<u&&(i=r)}if((n||l)&&t&&!V(e))return!0;for(r--;r>=0;r--){if(e.argValues[r]==null)continue;let a=r>i;const u=M(e,r,a);let f=e.indexes[r]-1;if(f>u&&(f=u),f>=0){e.indexes[r]=f,e.args[e.argsNames[r]]=e.argValues[r][f],f<u&&(a=!0);for(let d=r+1;d<o;d++)e.args[e.argsNames[d]]=void 0;for(r++;r<o;r++){e.argValues[r]=O(e,e.argsNames[r]);const d=M(e,r,a);if(d<0)break;e.indexes[r]=d,e.args[e.argsNames[r]]=e.argValues[r][d],d>0&&(a=!0)}if(r>=o)return!0}}return C(e),!1}function tt(e,n){C(e);const t=e.argsNames,o=t.length;let i=!1;for(let l=0;l<o;l++){const r=t[l],a=n[r];if(a===void 0)return null;e.argValues[l]=O(e,r);const u=M(e,l,i);if(u<0)return null;const f=U(e.argValues[l],a,e.equals);if(f<0||f>u)return null;e.indexes[l]=f,e.args[e.argsNames[l]]=e.argValues[l][f],e.indexes[l]<u&&(i=!0)}return V(e)?null:e.indexes.slice()}function rt(e){const n=e.indexes.length;if(n===0)return!1;let t=!1;for(let o=0;o<n;o++){e.argValues[o]=O(e,e.argsNames[o]);const i=M(e,o,t);if(i<0)return Math.random()<.5?ge(e):X(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 V(e)?X(e):!0}function D(e){return e.mode==="forward"||e.mode==="backward"}function nt(e,n,t,o){const i=n[t],l=e.templates[t];if(typeof l!="function"){if(U(l,i,o)>=0)return;l.push(i);return}const r=e.extra[t];if(r==null){e.extra[t]=[i];return}U(r,i,o)>=0||r.push(i)}function it(e,n,t){for(const o in n)if(Object.prototype.hasOwnProperty.call(n,o)){if(o==="seed")continue;nt(e,n,o,t)}}function ue(e,n){for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t)){if(t==="seed")continue;if(!e[t])return!1}return!0}const ot=[{mode:"forward"}];function st(e){const{argsTemplates:n,equals:t,limitArgOnError:o,includeErrorVariant:i,getSeed:l,iterationModes:r,onModeChange:a,limitCompletionCount:u,limitTests:f,limitTime:d}=e,h=e.timeController??ee.timeControllerDefault,y={templates:k.deepCloneJsonLike(n),extra:{}},p=r==null||r.length===0?ot:r,b=[];let S=null,L=null,g=0,w=0,I=!1,N=0;function $(){I||(I=!0,N=h.now(),ve(),g=0,ie(),Se())}function ve(){for(let s=0,c=p.length;s<c;s++)b.push(Ee())}function Ee(){return{navigationState:ae(y,t??null,o??null,i??null),cycleCount:0,completedCount:0,testsInLastTurn:0,tryNextVariantAttempts:0,startTime:null}}function Se(){S=ae(y,t??null,!1,!1)}function ie(){a?.({mode:p[g],modeIndex:g,tests:w})}function we(s){$(),ue(y.templates,s)&&it(y,s,t)}function oe(s,c){return $(),ue(y.templates,s)?(S.limitArgOnError=c?.limitArg??o??null,S.includeErrorVariant=c?.includeLimit??i??!1,tt(S,s)):null}function xe(s){const c=s?.args;if(c==null)return;$();const m=oe(c);if(m!=null){L={args:c,error:s?.error,tests:s?.tests??w},S.argLimits=m;for(let v=0,q=b.length;v<q;v++){const W=b[v].navigationState;W.argLimits=m}}}function Me(){return $(),Te()}function Te(){for(;;){if(!Ve())return null;for(;;){const s=qe();if(s!=null)return b[g].testsInLastTurn++,w++,s;if(Pe()){if(!Ne())return null;Ge();break}}}}function Ve(){return!(Ie()||Ae()||G()&&(Ce()||!Oe())||!Le())}function Ie(){return f!=null&&w>=f}function Ae(){return d!=null&&h.now()-N>=d}function Ce(){if(!G())throw new Error("Unexpected behavior");return u!=null&&u<=0}function Oe(){if(!G())throw new Error("Unexpected behavior");for(let s=0,c=p.length;s<c;s++)if(A(p[s])&&F(s))return!0;return!1}function Le(){for(let s=0,c=p.length;s<c;s++)if(F(s))return!0;return!1}function Pe(){g++;const s=g>=p.length;return s&&(g=0),ie(),s}function Ne(){if(G()){const s=$e();if(u!=null&&s>=u)return!1}return!0}function G(){for(let s=0,c=p.length;s<c;s++)if(D(p[s]))return!0;return!1}function $e(){let s=!1,c=1/0;for(let m=0,v=b.length;m<v;m++){const q=b[m],W=p[m];D(W)&&(s=!0,F(m)&&q.completedCount<c&&(c=q.completedCount))}if(!s)throw new Error("Unexpected behavior");return c}function F(s){const c=p[s],m=b[s];return c.limitTests!=null&&c.limitTests<=0||A(c)&&(c.cycles!=null&&c.cycles<=0||c.attemptsPerVariant!=null&&c.attemptsPerVariant<=0)?!1:m.tryNextVariantAttempts<2}function Ge(){g=0;for(let s=0,c=b.length;s<c;s++){const m=b[s];m.testsInLastTurn=0,m.startTime=null}}function qe(){let s=0;for(;s<2;){if(!De())return null;const c=Re();if(c!=null)return c;if(A(p[g])&&Be())return null;s++}return null}function De(){const s=p[g];return!(_e()||ke()||A(s)&&!Ue(g))}function _e(){const s=p[g],c=b[g];return s.limitTests!=null&&c.testsInLastTurn>=s.limitTests}function ke(){const s=p[g],c=b[g];return s.limitTime!=null&&c.startTime!=null&&h.now()-c.startTime>=s.limitTime}function A(s){return D(s)}function Ue(s){const c=p[s],m=b[s];if(!A(c))throw new Error("Unexpected behavior");return m.cycleCount<(c.cycles??1)}function Be(){const s=p[g],c=b[g];if(!A(s))throw new Error("Unexpected behavior");return c.cycleCount++,c.cycleCount>=(s.cycles??1)?(c.cycleCount=0,c.completedCount++,!0):!1}function Re(){const s=p[g],c=b[g],m=c.navigationState;if(P(s)){if(j())return null;const v=Fe();if(v!=null)return c.startTime==null&&(c.startTime=h.now()),v}return We()?(c.tryNextVariantAttempts=0,P(s)&&je(),c.startTime==null&&(c.startTime=h.now()),se(m.args)):(c.tryNextVariantAttempts++,null)}function Fe(){const s=p[g],m=b[g].navigationState;if(!P(s))throw new Error("Unexpected behavior");if(j())throw new Error("Unexpected behavior");const v=s.attemptsPerVariant??1;return m.attempts>0&&m.attempts<v?V(m)?null:(m.attempts++,se(m.args)):null}function je(){const s=p[g],m=b[g].navigationState;if(!P(s))throw new Error("Unexpected behavior");if(j())throw new Error("Unexpected behavior");m.attempts=1}function P(s){return D(s)}function j(){const s=p[g];if(!P(s))throw new Error("Unexpected behavior");return(s.attemptsPerVariant??1)<=0}function We(){const s=p[g],m=b[g].navigationState;switch(s.mode){case"forward":return ge(m);case"backward":return X(m);case"random":return rt(m);default:throw new Error(`Unknown mode: ${s.mode}`)}}function se(s){const c={...s};return l!=null&&(c.seed=l({tests:w})),c}return{get limit(){return L},get modeIndex(){return g},get modeConfigs(){return p},get modeStates(){return b},get tests(){return w},calcIndexes:oe,extendTemplates:we,addLimit:xe,next:Me}}function re(e){if(e==null||e<=0)throw new Error(`Iterations = ${e}`);e--;const n=E.waitMicrotasks().then(()=>e);return e<=0?n:n.then(re)}function lt(e,n,t){const o=n.limit?{error:n.limit.error,args:n.limit.args,tests:n.limit.tests}:null;if(o&&!t)throw o.error;return{iterations:e.iterations,bestError:o}}const ce=2**31;function at(e){if(e==null)return{parallel:1,sequentialOnError:!1};if(typeof e=="boolean")return{parallel:e?ce:1,sequentialOnError:!1};if(typeof e=="number")return{parallel:e>0?e:1,sequentialOnError:!1};const n=e.count;let t=1;return n===!0?t=ce:typeof n=="number"&&n>0&&(t=n),{parallel:t,sequentialOnError:e.sequentialOnError??!1}}function ut(e){const n=e?.saveErrorVariants,t=n&&e.createSaveErrorVariantsStore?e.createSaveErrorVariantsStore(n):null,o=e?.findBestError,{parallel:i,sequentialOnError:l}=at(e?.parallel);return{store:t,GC_Iterations:e?.GC_Iterations??1e6,GC_IterationsAsync:e?.GC_IterationsAsync??1e4,GC_Interval:e?.GC_Interval??1e3,logOptions:me(e?.log),abortSignalExternal:e?.abortSignal,findBestError:o,dontThrowIfError:o?.dontThrowIfError,timeController:e?.timeController??ee.timeControllerDefault,parallel:i,sequentialOnError:l}}function B(e,n,t){const{options:o,variantsIterator:i}=e,l=i.limit?.args??n;if(!o.store)return;const r=o.store.save(l);if(t)return r}function ct(e,n,t,o){const{abortControllerParallel:i,state:l,options:r}=e,{logOptions:a}=r;if(e.options.findBestError)e.variantsIterator.addLimit({args:n,error:t,tests:o}),l.debugMode=!1,B(e,n,!1),r.sequentialOnError&&!i.signal.aborted?(a.debug&&a.func("debug","[test-variants] sequentialOnError: aborting parallel, switching to sequential"),i.abort(new T)):a.debug&&a.func("debug","[test-variants] parallel error in findBestError mode, continuing with new limits");else{if(i.signal.aborted)return;B(e,n,!1),i.abort(t)}}function fe(e,n,t,o){const{state:i}=e;if(e.options.findBestError){e.variantsIterator.addLimit({args:n,error:t,tests:o});const r=B(e,n,!0);if(r)return r.then(()=>{i.debugMode=!1});i.debugMode=!1;return}const l=B(e,n,!0);if(l)return l.then(()=>{throw t});throw t}function ft(e,n){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&&n-e.state.prevGcTime>=i}async function dt(e,n){e.prevGcIterations=e.iterations,e.prevGcIterationsAsync=e.iterationsAsync,e.prevGcTime=n,await re(1)}function ne(e){const n=e/1e3;if(n<60)return`${n.toFixed(1)}s`;const t=n/60;return t<60?`${t.toFixed(1)}m`:`${(t/60).toFixed(1)}h`}function Z(e){const n=e/1073741824;if(n>=1)return n>=10?`${Math.round(n)}GB`:`${n.toFixed(1)}GB`;const t=e/(1024*1024);return t>=10?`${Math.round(t)}MB`:`${t.toFixed(1)}MB`}function mt(e,n){if(!e)return`mode[${n}]: null`;let t=`mode[${n}]: ${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=${ne(e.limitTime)}`),e.limitTests!=null&&(t+=`, limitTests=${e.limitTests}`),t}function pe(e,n){const t=e-n,o=t>=0?"+":"";return`${Z(e)} (${o}${Z(t)})`}function gt(e,n){if(!e.start)return;let t="[test-variants] start";n!=null&&(t+=`, memory: ${Z(n)}`),e.func("start",t)}function pt(e){const{options:n,state:t}=e,{logOptions:o,timeController:i}=n;if(!o.completed)return;const l=i.now()-t.startTime;let r=`[test-variants] end, tests: ${t.tests} (${ne(l)}), async: ${t.iterationsAsync}`;if(t.startMemory!=null){const a=te();a!=null&&(r+=`, memory: ${pe(a,t.startMemory)}`)}o.func("completed",r)}function he(e){const{options:n,state:t}=e,{logOptions:o}=n,i=t.pendingModeChange;!o.modeChange||i==null||(o.func("modeChange",`[test-variants] ${mt(i.mode,i.modeIndex)}`),t.pendingModeChange=null)}function ht(e){const{options:n,state:t}=e,{logOptions:o,timeController:i}=n,l=i.now();if(!o.progress||l-t.prevLogTime<o.progress)return!1;he(e);const r=l-t.startTime;let a=`[test-variants] tests: ${t.tests} (${ne(r)}), async: ${t.iterationsAsync}`;if(t.prevLogMemory!=null){const u=te();u!=null&&(a+=`, memory: ${pe(u,t.prevLogMemory)}`,t.prevLogMemory=u)}return o.func("progress",a),t.prevLogTime=l,!0}function K(e,n){e.debugMode=!1,n&&(e.iterationsAsync+=n.iterationsAsync,e.iterations+=n.iterationsSync+n.iterationsAsync)}function Q(e){e.state.debugMode=!0,e.abortControllerParallel.abort(new T)}function be(e,n){const{testRun:t,testOptions:o,state:i}=e,l=i.tests;i.tests++;try{const r=t(n,l,o);if(E.isPromiseLike(r))return r.then(a=>{if(!a){Q(e);return}K(i,a)},a=>fe(e,n,a,l));if(!r){Q(e);return}K(i,r)}catch(r){return r instanceof T?void 0:fe(e,n,r,l)}}function bt(e,n){const{pool:t,abortSignal:o,testRun:i,testOptionsParallel:l,state:r}=e;if(!t)return;const a=r.tests;r.tests++,(async()=>{try{if(o.aborted)return;let u=i(n,a,l);if(E.isPromiseLike(u)&&(u=await u),!u){Q(e);return}K(r,u)}catch(u){if(u instanceof T)return;ct(e,n,u,a)}finally{t.release(1)}})()}function ye(e){const{options:n,state:t}=e,{logOptions:o,timeController:i,GC_Interval:l}=n;if(!o.progress&&!l)return;ht(e);const r=i.now();if(ft(e,r))return dt(t,r)}function R(e){return e.options.abortSignalExternal?.aborted??!1}function Y(e){return e.abortSignal.aborted}async function z(e,n){const{pool:t,state:o,options:i}=e,{parallel:l,logOptions:r}=i;let a=null;for(;!R(e);){const u=t&&!Y(e);let f=!1;u&&(t.hold(1)||await J.poolWait({pool:t,count:1,hold:!0}),f=!0);try{if(n!=null?(a=n,n=null):e.state.debugMode||(a=e.variantsIterator.next()),a==null)break;const d=ye(e);if(E.isPromiseLike(d)&&await d,R(e))continue;if(u)bt(e,a),f=!1;else{r.debug&&t&&Y(e)&&r.func("debug",`[test-variants] parallel aborted, running sequential: tests=${o.tests}`);const h=be(e,a);E.isPromiseLike(h)&&await h}}finally{f&&t.release(1)}}t&&(await J.poolWait({pool:t,count:l,hold:!0}),t.release(l))}function yt(e){const{pool:n,state:t,options:o}=e,{logOptions:i}=o;if(n)return z(e);let l=null;for(;!R(e)&&(e.state.debugMode||(l=e.variantsIterator.next()),l!=null);){const r=ye(e);if(E.isPromiseLike(r))return r.then(()=>z(e,l));if(R(e))continue;i.debug&&Y(e)&&i.func("debug",`[test-variants] parallel aborted, running sequential: tests=${t.tests}`);const a=be(e,l);if(E.isPromiseLike(a))return a.then(()=>z(e))}}async function vt(e,n,t,o){const i=ut(o),{store:l,logOptions:r,abortSignalExternal:a,findBestError:u,dontThrowIfError:f,timeController:d,parallel:h}=i,y=new H.AbortControllerFast,p=new H.AbortControllerFast,b=E.combineAbortSignals(a,y.signal),S=E.combineAbortSignals(b,p.signal),L={abortSignal:b,timeController:d},g={abortSignal:S,timeController:d};l&&await l.replay({testRun:e,variantsIterator:n,testOptions:L,findBestErrorEnabled:!!u});const w=h<=1?null:new J.Pool(h);gt(r,t.startMemory);const I={options:i,testRun:e,variantsIterator:n,testOptions:L,testOptionsParallel:g,abortControllerGlobal:y,abortControllerParallel:p,abortSignal:S,pool:w,state:t};he(I);try{await yt(I),S.throwIfAborted()}catch(N){throw y.abort(new T),N}return b.throwIfAborted(),y.abort(new T),pt(I),await re(1),lt(t,n,f)}function Et(e){return function(t){return async function(i){const l=me(i?.log),r=et(e,{onError:i?.onError,log:l,pauseDebuggerOnError:i?.pauseDebuggerOnError}),a=i?.timeController??ee.timeControllerDefault,u=te(),f=Ke(a,u),d=i?.onModeChange;function h(p){f.pendingModeChange=p,d?.(p)}const y=st({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 vt(r,y,f,i)}}}exports.createTestVariants=Et;
|
package/build/node/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("../createTestVariants-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("../createTestVariants-BYmqvvhv.js"),F=require("path"),O=require("@flemist/async-utils"),y=require("@flemist/simple-utils"),x=require("@flemist/simple-utils/node"),P=require("fs");function v(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const r=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,r.get?r:{enumerable:!0,get:()=>e[s]})}}return t.default=e,Object.freeze(t)}const m=v(F),u=v(P);async function b(e){const t=await u.promises.stat(e).catch(()=>null);if(t==null)return[];if(!t.isDirectory())throw new Error(`[saveErrorVariants] path is not a directory: ${e}`);return(await u.promises.readdir(e)).filter(n=>n.endsWith(".json")).sort((n,a)=>n>a?-1:n<a?1:0).map(n=>m.join(e,n))}async function A(e,t){const s=await u.promises.readFile(e,"utf-8");let r;try{r=JSON.parse(s)}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 q(e){const t=Math.random().toString(36).substring(2);return y.formatDateFileName(e.sessionDate,"UTC")+"_"+t+".json"}async function D(e,t,s){let r;if(s){const n=s(e);typeof n=="string"?r=n:r=JSON.stringify(n,null,2)}else r=JSON.stringify(e,null,2);await u.promises.mkdir(m.dirname(t),{recursive:!0}),await u.promises.writeFile(t,r,"utf-8")}function L(e,t){const s=Math.max(e.length,t.length);for(let r=0;r<s;r++){const n=e[r],a=t[r];if(n==null){if(a==null)continue;return 1}if(a==null||n<a)return-1;if(n>a)return 1}return 0}class N{options;filePath;lastSavedArgs=null;constructor(t){this.options=t;const s=new Date;this.filePath=m.resolve(t.dir,t.getFilePath?.({sessionDate:s})??q({sessionDate:s}))}async save(t){y.deepEqualJsonLike(t,this.lastSavedArgs)||(this.lastSavedArgs={...t},await x.fileLock({filePath:this.filePath,func:()=>D(t,this.filePath,this.options.argsToJson)}))}async replay(t){const{testRun:s,variantsIterator:r,testOptions:n,findBestErrorEnabled:a}=t,h=this.options.useToFindBestError,E=this.options.limitArg??!1,V=this.options.extendTemplates??!1,S=this.options.attemptsPerVariant??1,g=new Map;function d(i){let o=g.get(i);return o===void 0&&(o=r.calcIndexes(i,{includeLimit:!1,limitArg:E}),g.set(i,o)),o}const w=await b(this.options.dir),f=[];for(let i=0,o=w.length;i<o;i++){const p=w[i],c=await A(p,this.options.jsonToArgs);V&&r.extendTemplates(c),d(c)!=null&&f.push(c)}function T(i,o){return L(d(i),d(o))}f.sort(T);for(let i=0,o=f.length;i<o;i++){const p=f[i];for(let c=0;c<S;c++)try{const l=s(p,0,n);O.isPromiseLike(l)&&await l}catch(l){if(h&&a){r.addLimit({args:p,error:l});break}throw l}}}}function k(e){return new N(e)}function _(e){const t=j.createTestVariants(e);return function(r){const n=t(r);return function(h){return n({...h,createSaveErrorVariantsStore:k})}}}exports.createTestVariants=_;
|
package/build/node/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as x } from "../createTestVariants-
|
|
1
|
+
import { c as x } from "../createTestVariants-BXmWQaT8.mjs";
|
|
2
2
|
import * as d from "path";
|
|
3
3
|
import { isPromiseLike as F } from "@flemist/async-utils";
|
|
4
4
|
import { formatDateFileName as S, deepEqualJsonLike as A } from "@flemist/simple-utils";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flemist/test-variants",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.5",
|
|
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",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"default": "./src/common/index.ts"
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
|
+
"packageManager": "pnpm@10.18.3",
|
|
45
46
|
"engines": {
|
|
46
47
|
"node": ">=20"
|
|
47
48
|
},
|
|
@@ -76,6 +77,38 @@
|
|
|
76
77
|
"publishConfig": {
|
|
77
78
|
"access": "public"
|
|
78
79
|
},
|
|
80
|
+
"scripts": {
|
|
81
|
+
"========================= install =========================": "",
|
|
82
|
+
"_prepublishOnly": "run-p audit lint build test:all && npm login",
|
|
83
|
+
"prepare": "node .husky/install.mjs",
|
|
84
|
+
"install:playwright": "pnpm exec playwright install --with-deps",
|
|
85
|
+
"========================= deploy =========================": "",
|
|
86
|
+
"build": "vite build",
|
|
87
|
+
"========================= lint =========================": "",
|
|
88
|
+
"audit": "pnpm audit --prod",
|
|
89
|
+
"lint:es": "eslint .",
|
|
90
|
+
"lint:es:fix": "eslint --fix .",
|
|
91
|
+
"lint": "run-p lint:es",
|
|
92
|
+
"lint:fix": "run-s lint:es:fix",
|
|
93
|
+
"lint-staged": "lint-staged",
|
|
94
|
+
"check:types": "tsc --noEmit",
|
|
95
|
+
"check": "run-p audit check:types lint",
|
|
96
|
+
"========================= test =========================": "",
|
|
97
|
+
"test:node": "vitest --run --config vite.projects.ts --project node --bail 3",
|
|
98
|
+
"test:browser": "vitest --run --config vite.projects.ts --project browser --bail 3",
|
|
99
|
+
"test:chrome": "vitest --run --config vite.projects.ts --project browser --browser chromium --bail 3",
|
|
100
|
+
"test:all": "vitest --run --config vite.projects.ts --bail 3",
|
|
101
|
+
"test": "run-s test:node test:browser",
|
|
102
|
+
"========================= dev =========================": "",
|
|
103
|
+
"kill-node": "taskkill /F /IM node.exe",
|
|
104
|
+
"kill-java": "taskkill /F /IM java.exe",
|
|
105
|
+
"kill-chrome": "taskkill /F /IM chrome.exe",
|
|
106
|
+
"========================= mcp =========================": "",
|
|
107
|
+
"mcp:playwright": "mcp-server-playwright --port 8002 --host local.host --isolated",
|
|
108
|
+
"========================= other =========================": "",
|
|
109
|
+
"mcp:tools": "mcp-project-tools",
|
|
110
|
+
"dep:fix": "tsx tools/dep-fix.ts"
|
|
111
|
+
},
|
|
79
112
|
"devDependencies": {
|
|
80
113
|
"@eslint/compat": "1.2.4",
|
|
81
114
|
"@eslint/eslintrc": "3.2.0",
|
|
@@ -115,35 +148,5 @@
|
|
|
115
148
|
"@flemist/time-controller": "^1.0.4",
|
|
116
149
|
"@flemist/time-limits": "^2.0.4",
|
|
117
150
|
"tslib": ">=2.8.1"
|
|
118
|
-
},
|
|
119
|
-
"scripts": {
|
|
120
|
-
"========================= install =========================": "",
|
|
121
|
-
"install:playwright": "pnpm exec playwright install --with-deps",
|
|
122
|
-
"========================= deploy =========================": "",
|
|
123
|
-
"build": "vite build",
|
|
124
|
-
"========================= lint =========================": "",
|
|
125
|
-
"audit": "pnpm audit --prod",
|
|
126
|
-
"lint:es": "eslint .",
|
|
127
|
-
"lint:es:fix": "eslint --fix .",
|
|
128
|
-
"lint": "run-p lint:es",
|
|
129
|
-
"lint:fix": "run-s lint:es:fix",
|
|
130
|
-
"lint-staged": "lint-staged",
|
|
131
|
-
"check:types": "tsc --noEmit",
|
|
132
|
-
"check": "run-p audit check:types lint",
|
|
133
|
-
"========================= test =========================": "",
|
|
134
|
-
"test:node": "vitest --run --config vite.projects.ts --project node --bail 3",
|
|
135
|
-
"test:browser": "vitest --run --config vite.projects.ts --project browser --bail 3",
|
|
136
|
-
"test:chrome": "vitest --run --config vite.projects.ts --project browser --browser chromium --bail 3",
|
|
137
|
-
"test:all": "vitest --run --config vite.projects.ts --bail 3",
|
|
138
|
-
"test": "run-s test:node test:browser",
|
|
139
|
-
"========================= dev =========================": "",
|
|
140
|
-
"kill-node": "taskkill /F /IM node.exe",
|
|
141
|
-
"kill-java": "taskkill /F /IM java.exe",
|
|
142
|
-
"kill-chrome": "taskkill /F /IM chrome.exe",
|
|
143
|
-
"========================= mcp =========================": "",
|
|
144
|
-
"mcp:playwright": "mcp-server-playwright --port 8002 --host local.host --isolated",
|
|
145
|
-
"========================= other =========================": "",
|
|
146
|
-
"mcp:tools": "mcp-project-tools",
|
|
147
|
-
"dep:fix": "tsx tools/dep-fix.ts"
|
|
148
151
|
}
|
|
149
|
-
}
|
|
152
|
+
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
"use strict";const ee=require("@flemist/time-controller"),U=require("@flemist/simple-utils"),S=require("@flemist/async-utils"),H=require("@flemist/abort-controller-fast"),J=require("@flemist/time-limits");function te(){if(typeof process<"u"&&process.memoryUsage)try{return process.memoryUsage().heapUsed}catch{}if(typeof performance<"u"){const e=performance.memory;if(e)try{return e.usedJSHeapSize}catch{}}return null}const He=1e3,k=[];function Je(e){return U.formatAny(e,{pretty:!0,maxDepth:5,maxItems:50})}function Xe(...e){const n=e.map(t=>typeof t=="string"?t:Je(t)).join(" ");k.push(n),k.length>He&&k.shift(),console.log(n)}function Ze(){return k.join(`
|
|
2
|
-
`)}globalThis.__getStressTestLogLast=Ze;const de=(e,n)=>{Xe(n)},E={start:!0,progress:5e3,completed:!0,error:!0,modeChange:!0,debug:!1,func:de},Ke={start:!1,progress:!1,completed:!1,error:!1,modeChange:!1,debug:!1,func:de};function me(e){return e===!1?Ke:e===!0||!e?E:{start:e.start??E.start,progress:e.progress??E.progress,completed:e.completed??E.completed,error:e.error??E.error,modeChange:e.modeChange??E.modeChange,debug:e.debug??E.debug,func:e.func??E.func}}function Qe(e,n){const t=e.now();return{startTime:t,startMemory:n,debugMode:!1,tests:0,iterations:0,iterationsAsync:0,prevLogTime:t,prevLogMemory:n,pendingModeChange:null,prevGcTime:t,prevGcIterations:0,prevGcIterationsAsync:0}}class T extends H.AbortError{}const Ye=50,et=5;function le(e,n){return typeof e=="number"?{iterationsAsync:0,iterationsSync:e}:e!=null&&typeof e=="object"?e:n?{iterationsAsync:1,iterationsSync:0}:{iterationsAsync:0,iterationsSync:1}}function tt(e,n){const t=n.log;let i=null,o=0;function l(r,a,u){i==null&&(i={error:r,args:a,tests:u},t.error&&t.func("error",`[test-variants] error variant: ${U.formatAny(a,{pretty:!0})}
|
|
3
|
-
tests: ${u}
|
|
4
|
-
${U.formatAny(r)}`));const d=Date.now();if(Date.now()-d>Ye&&o<et){t.func("debug",`[test-variants] debug iteration: ${o}`),o++;return}const h=i;throw i=null,n.onError&&n.onError(h),h.error}return function(a,u,d){try{const f=e(a,d);return S.isPromiseLike(f)?f.then(h=>le(h,!0),h=>l(h,a,u)):le(f,!1)}catch(f){return f instanceof T?void 0:l(f,a,u)}}}function D(e,n,t){for(let i=0,o=e.length;i<o;i++)if(t?t(e[i],n):e[i]===n)return i;return-1}function ae(e,n,t,i){const o=Object.keys(e.templates),l={},r=[],a=[],u=[],d=o.length;for(let f=0;f<d;f++){const h=o[f];l[h]=void 0,r.push(-1),a.push(void 0),u.push(null)}return{args:l,argsNames:o,indexes:r,argValues:a,argLimits:u,attempts:0,templates:e,limitArgOnError:t,equals:n,includeErrorVariant:i??!1}}function L(e,n){const t=e.templates.templates[n],i=e.templates.extra[n];let o;if(typeof t=="function"?o=t(e.args):o=t,i==null)return o;let l=null;const r=i.length;for(let a=0;a<r;a++){const u=i[a];D(o,u,e.equals)<0&&(l==null?l=[...o,u]:l.push(u))}return l??o}function M(e,n,t){const i=e.argValues[n].length;if(i===0)return-1;const o=e.argLimits[n];if(o==null)return i-1;let l=e.limitArgOnError;if(typeof l=="function"){const r=e.argsNames[n];l=l({name:r,values:e.argValues[n],maxValueIndex:o})}return!t||l?Math.min(o,i-1):i-1}function V(e){const n=e.indexes.length;for(let t=0;t<n;t++){const i=e.argLimits[t];if(i==null)return!1;const o=e.indexes[t];if(o>i)return!0;if(o<i)return!1}return!e.includeErrorVariant}function C(e){const n=e.indexes.length;for(let t=0;t<n;t++)e.indexes[t]=-1,e.argValues[t]=void 0,e.args[e.argsNames[t]]=void 0}function ge(e){let n=!1,t=!0;const i=e.indexes.length;let o=i,l=!1,r=0;for(;r<i;r++){const a=e.argValues[r]==null;(a||l)&&(a&&(n=!0),e.argValues[r]=L(e,e.argsNames[r]));const u=M(e,r,r>o);if(u<0){t=!1,e.indexes[r]=-1;break}a&&(e.indexes[r]=0,e.args[e.argsNames[r]]=e.argValues[r][0]),(l||e.indexes[r]>u)&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u],l=!0),o===i&&e.indexes[r]<u&&(o=r)}if(V(e))return C(e),!1;if(n&&t)return!0;for(r--;r>=0;r--){if(e.argValues[r]==null)continue;let a=r>o;const u=M(e,r,a),d=e.indexes[r]+1;if(d<=u){e.indexes[r]=d,e.args[e.argsNames[r]]=e.argValues[r][d],d<u&&(a=!0);for(let f=r+1;f<i;f++)e.args[e.argsNames[f]]=void 0;for(r++;r<i;r++){e.argValues[r]=L(e,e.argsNames[r]);const f=M(e,r,a);if(f<0)break;e.indexes[r]=0,e.args[e.argsNames[r]]=e.argValues[r][0],f>0&&(a=!0)}if(r>=i)return V(e)?(C(e),!1):!0}}return C(e),!1}function X(e){V(e)&&C(e);let n=!1,t=!0;const i=e.indexes.length;let o=i,l=!1,r=0;for(;r<i;r++){const a=e.argValues[r]==null;(a||l)&&(a&&(n=!0),e.argValues[r]=L(e,e.argsNames[r]));const u=M(e,r,r>o);if(u<0){t=!1,e.indexes[r]=-1;break}a&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u]),(l||e.indexes[r]>u)&&(e.indexes[r]=u,e.args[e.argsNames[r]]=e.argValues[r][u],l=!0),o===i&&e.indexes[r]<u&&(o=r)}if((n||l)&&t&&!V(e))return!0;for(r--;r>=0;r--){if(e.argValues[r]==null)continue;let a=r>o;const u=M(e,r,a);let d=e.indexes[r]-1;if(d>u&&(d=u),d>=0){e.indexes[r]=d,e.args[e.argsNames[r]]=e.argValues[r][d],d<u&&(a=!0);for(let f=r+1;f<i;f++)e.args[e.argsNames[f]]=void 0;for(r++;r<i;r++){e.argValues[r]=L(e,e.argsNames[r]);const f=M(e,r,a);if(f<0)break;e.indexes[r]=f,e.args[e.argsNames[r]]=e.argValues[r][f],f>0&&(a=!0)}if(r>=i)return!0}}return C(e),!1}function rt(e,n){C(e);const t=e.argsNames,i=t.length;let o=!1;for(let l=0;l<i;l++){const r=t[l],a=n[r];if(a===void 0)return null;e.argValues[l]=L(e,r);const u=M(e,l,o);if(u<0)return null;const d=D(e.argValues[l],a,e.equals);if(d<0||d>u)return null;e.indexes[l]=d,e.args[e.argsNames[l]]=e.argValues[l][d],e.indexes[l]<u&&(o=!0)}return V(e)?null:e.indexes.slice()}function nt(e){const n=e.indexes.length;if(n===0)return!1;let t=!1;for(let i=0;i<n;i++){e.argValues[i]=L(e,e.argsNames[i]);const o=M(e,i,t);if(o<0)return Math.random()<.5?ge(e):X(e);e.indexes[i]=Math.floor(Math.random()*(o+1)),e.args[e.argsNames[i]]=e.argValues[i][e.indexes[i]],e.indexes[i]<o&&(t=!0)}return V(e)?X(e):!0}function _(e){return e.mode==="forward"||e.mode==="backward"}function it(e,n,t,i){const o=n[t],l=e.templates[t];if(typeof l!="function"){if(D(l,o,i)>=0)return;l.push(o);return}const r=e.extra[t];if(r==null){e.extra[t]=[o];return}D(r,o,i)>=0||r.push(o)}function ot(e,n,t){for(const i in n)if(Object.prototype.hasOwnProperty.call(n,i)){if(i==="seed")continue;it(e,n,i,t)}}function ue(e,n){for(const t in n)if(Object.prototype.hasOwnProperty.call(n,t)){if(t==="seed")continue;if(!e[t])return!1}return!0}const st=[{mode:"forward"}];function lt(e){const{argsTemplates:n,equals:t,limitArgOnError:i,includeErrorVariant:o,getSeed:l,iterationModes:r,onModeChange:a,limitCompletionCount:u,limitTests:d,limitTime:f}=e,h=e.timeController??ee.timeControllerDefault,y={templates:U.deepCloneJsonLike(n),extra:{}},p=r==null||r.length===0?st:r,b=[];let w=null,O=null,g=0,x=0,A=!1,N=0;function $(){A||(A=!0,N=h.now(),Se(),g=0,ie(),xe())}function Se(){for(let s=0,c=p.length;s<c;s++)b.push(we())}function we(){return{navigationState:ae(y,t??null,i??null,o??null),cycleCount:0,completedCount:0,testsInLastTurn:0,tryNextVariantAttempts:0,startTime:null}}function xe(){w=ae(y,t??null,!1,!1)}function ie(){a?.({mode:p[g],modeIndex:g,tests:x})}function Ee(s){$(),ue(y.templates,s)&&ot(y,s,t)}function oe(s,c){return $(),ue(y.templates,s)?(w.limitArgOnError=c?.limitArg??i??null,w.includeErrorVariant=c?.includeLimit??o??!1,rt(w,s)):null}function Me(s){const c=s?.args;if(c==null)return;$();const m=oe(c);if(m!=null){O={args:c,error:s?.error,tests:s?.tests??x},w.argLimits=m;for(let v=0,q=b.length;v<q;v++){const W=b[v].navigationState;W.argLimits=m}}}function Te(){return $(),Ve()}function Ve(){for(;;){if(!Ae())return null;for(;;){const s=_e();if(s!=null)return b[g].testsInLastTurn++,x++,s;if(Ne()){if(!$e())return null;qe();break}}}}function Ae(){return!(Ie()||Ce()||G()&&(Le()||!Oe())||!Pe())}function Ie(){return d!=null&&x>=d}function Ce(){return f!=null&&h.now()-N>=f}function Le(){if(!G())throw new Error("Unexpected behavior");return u!=null&&u<=0}function Oe(){if(!G())throw new Error("Unexpected behavior");for(let s=0,c=p.length;s<c;s++)if(I(p[s])&&F(s))return!0;return!1}function Pe(){for(let s=0,c=p.length;s<c;s++)if(F(s))return!0;return!1}function Ne(){g++;const s=g>=p.length;return s&&(g=0),ie(),s}function $e(){if(G()){const s=Ge();if(u!=null&&s>=u)return!1}return!0}function G(){for(let s=0,c=p.length;s<c;s++)if(_(p[s]))return!0;return!1}function Ge(){let s=!1,c=1/0;for(let m=0,v=b.length;m<v;m++){const q=b[m],W=p[m];_(W)&&(s=!0,F(m)&&q.completedCount<c&&(c=q.completedCount))}if(!s)throw new Error("Unexpected behavior");return c}function F(s){const c=p[s],m=b[s];return c.limitTests!=null&&c.limitTests<=0||I(c)&&(c.cycles!=null&&c.cycles<=0||c.attemptsPerVariant!=null&&c.attemptsPerVariant<=0)?!1:m.tryNextVariantAttempts<2}function qe(){g=0;for(let s=0,c=b.length;s<c;s++){const m=b[s];m.testsInLastTurn=0,m.startTime=null}}function _e(){let s=0;for(;s<2;){if(!ke())return null;const c=Fe();if(c!=null)return c;if(I(p[g])&&Re())return null;s++}return null}function ke(){const s=p[g];return!(Ue()||De()||I(s)&&!Be(g))}function Ue(){const s=p[g],c=b[g];return s.limitTests!=null&&c.testsInLastTurn>=s.limitTests}function De(){const s=p[g],c=b[g];return s.limitTime!=null&&c.startTime!=null&&h.now()-c.startTime>=s.limitTime}function I(s){return _(s)}function Be(s){const c=p[s],m=b[s];if(!I(c))throw new Error("Unexpected behavior");return m.cycleCount<(c.cycles??1)}function Re(){const s=p[g],c=b[g];if(!I(s))throw new Error("Unexpected behavior");return c.cycleCount++,c.cycleCount>=(s.cycles??1)?(c.cycleCount=0,c.completedCount++,!0):!1}function Fe(){const s=p[g],c=b[g],m=c.navigationState;if(P(s)){if(j())return null;const v=je();if(v!=null)return c.startTime==null&&(c.startTime=h.now()),v}return ze()?(c.tryNextVariantAttempts=0,P(s)&&We(),c.startTime==null&&(c.startTime=h.now()),se(m.args)):(c.tryNextVariantAttempts++,null)}function je(){const s=p[g],m=b[g].navigationState;if(!P(s))throw new Error("Unexpected behavior");if(j())throw new Error("Unexpected behavior");const v=s.attemptsPerVariant??1;return m.attempts>0&&m.attempts<v?V(m)?null:(m.attempts++,se(m.args)):null}function We(){const s=p[g],m=b[g].navigationState;if(!P(s))throw new Error("Unexpected behavior");if(j())throw new Error("Unexpected behavior");m.attempts=1}function P(s){return _(s)}function j(){const s=p[g];if(!P(s))throw new Error("Unexpected behavior");return(s.attemptsPerVariant??1)<=0}function ze(){const s=p[g],m=b[g].navigationState;switch(s.mode){case"forward":return ge(m);case"backward":return X(m);case"random":return nt(m);default:throw new Error(`Unknown mode: ${s.mode}`)}}function se(s){const c={...s};return l!=null&&(c.seed=l({tests:x})),c}return{get limit(){return O},get modeIndex(){return g},get modeConfigs(){return p},get modeStates(){return b},get tests(){return x},calcIndexes:oe,extendTemplates:Ee,addLimit:Me,next:Te}}function re(e){if(e==null||e<=0)throw new Error(`Iterations = ${e}`);e--;const n=S.waitMicrotasks().then(()=>e);return e<=0?n:n.then(re)}function at(e,n,t){const i=n.limit?{error:n.limit.error,args:n.limit.args,tests:n.limit.tests}:null;if(i&&!t)throw i.error;return{iterations:e.iterations,bestError:i}}const ce=2**31;function ut(e){if(e==null)return{parallel:1,sequentialOnError:!1};if(typeof e=="boolean")return{parallel:e?ce:1,sequentialOnError:!1};if(typeof e=="number")return{parallel:e>0?e:1,sequentialOnError:!1};const n=e.count;let t=1;return n===!0?t=ce:typeof n=="number"&&n>0&&(t=n),{parallel:t,sequentialOnError:e.sequentialOnError??!1}}function ct(e){const n=e?.saveErrorVariants,t=n&&e.createSaveErrorVariantsStore?e.createSaveErrorVariantsStore(n):null,i=e?.findBestError,{parallel:o,sequentialOnError:l}=ut(e?.parallel);return{store:t,GC_Iterations:e?.GC_Iterations??1e6,GC_IterationsAsync:e?.GC_IterationsAsync??1e4,GC_Interval:e?.GC_Interval??1e3,logOptions:me(e?.log),abortSignalExternal:e?.abortSignal,findBestError:i,dontThrowIfError:i?.dontThrowIfError,timeController:e?.timeController??ee.timeControllerDefault,parallel:o,sequentialOnError:l}}function B(e,n,t){const{options:i,variantsIterator:o}=e,l=o.limit?.args??n;if(!i.store)return;const r=i.store.save(l);if(t)return r}function ft(e,n,t,i){const{abortControllerParallel:o,state:l,options:r}=e,{logOptions:a}=r;if(e.options.findBestError)e.variantsIterator.addLimit({args:n,error:t,tests:i}),l.debugMode=!1,B(e,n,!1),r.sequentialOnError&&!o.signal.aborted?(a.debug&&a.func("debug","[test-variants] sequentialOnError: aborting parallel, switching to sequential"),o.abort(new T)):a.debug&&a.func("debug","[test-variants] parallel error in findBestError mode, continuing with new limits");else{if(o.signal.aborted)return;B(e,n,!1),o.abort(t)}}function fe(e,n,t,i){const{state:o}=e;if(e.options.findBestError){e.variantsIterator.addLimit({args:n,error:t,tests:i});const r=B(e,n,!0);if(r)return r.then(()=>{o.debugMode=!1});o.debugMode=!1;return}const l=B(e,n,!0);if(l)return l.then(()=>{throw t});throw t}function dt(e,n){const{GC_Iterations:t,GC_IterationsAsync:i,GC_Interval:o}=e.options;return t>0&&e.state.iterations-e.state.prevGcIterations>=t||i>0&&e.state.iterationsAsync-e.state.prevGcIterationsAsync>=i||o>0&&n-e.state.prevGcTime>=o}async function mt(e,n){e.prevGcIterations=e.iterations,e.prevGcIterationsAsync=e.iterationsAsync,e.prevGcTime=n,await re(1)}function ne(e){const n=e/1e3;if(n<60)return`${n.toFixed(1)}s`;const t=n/60;return t<60?`${t.toFixed(1)}m`:`${(t/60).toFixed(1)}h`}function Z(e){const n=e/1073741824;if(n>=1)return n>=10?`${Math.round(n)}GB`:`${n.toFixed(1)}GB`;const t=e/(1024*1024);return t>=10?`${Math.round(t)}MB`:`${t.toFixed(1)}MB`}function gt(e,n){if(!e)return`mode[${n}]: null`;let t=`mode[${n}]: ${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=${ne(e.limitTime)}`),e.limitTests!=null&&(t+=`, limitTests=${e.limitTests}`),t}function pe(e,n){const t=e-n,i=t>=0?"+":"";return`${Z(e)} (${i}${Z(t)})`}function pt(e,n){if(!e.start)return;let t="[test-variants] start";n!=null&&(t+=`, memory: ${Z(n)}`),e.func("start",t)}function ht(e){const{options:n,state:t}=e,{logOptions:i,timeController:o}=n;if(!i.completed)return;const l=o.now()-t.startTime;let r=`[test-variants] end, tests: ${t.tests} (${ne(l)}), async: ${t.iterationsAsync}`;if(t.startMemory!=null){const a=te();a!=null&&(r+=`, memory: ${pe(a,t.startMemory)}`)}i.func("completed",r)}function he(e){const{options:n,state:t}=e,{logOptions:i}=n,o=t.pendingModeChange;!i.modeChange||o==null||(i.func("modeChange",`[test-variants] ${gt(o.mode,o.modeIndex)}`),t.pendingModeChange=null)}function bt(e){const{options:n,state:t}=e,{logOptions:i,timeController:o}=n,l=o.now();if(!i.progress||l-t.prevLogTime<i.progress)return!1;he(e);const r=l-t.startTime;let a=`[test-variants] tests: ${t.tests} (${ne(r)}), async: ${t.iterationsAsync}`;if(t.prevLogMemory!=null){const u=te();u!=null&&(a+=`, memory: ${pe(u,t.prevLogMemory)}`,t.prevLogMemory=u)}return i.func("progress",a),t.prevLogTime=l,!0}function K(e,n){e.debugMode=!1,n&&(e.iterationsAsync+=n.iterationsAsync,e.iterations+=n.iterationsSync+n.iterationsAsync)}function Q(e){e.state.debugMode=!0,e.abortControllerParallel.abort(new T)}function be(e,n){const{testRun:t,testOptions:i,state:o}=e,l=o.tests;o.tests++;try{const r=t(n,l,i);if(S.isPromiseLike(r))return r.then(a=>{if(!a){Q(e);return}K(o,a)},a=>fe(e,n,a,l));if(!r){Q(e);return}K(o,r)}catch(r){return r instanceof T?void 0:fe(e,n,r,l)}}function yt(e,n){const{pool:t,abortSignal:i,testRun:o,testOptionsParallel:l,state:r}=e;if(!t)return;const a=r.tests;r.tests++,(async()=>{try{if(i.aborted)return;let u=o(n,a,l);if(S.isPromiseLike(u)&&(u=await u),!u){Q(e);return}K(r,u)}catch(u){if(u instanceof T)return;ft(e,n,u,a)}finally{t.release(1)}})()}function ye(e){const{options:n,state:t}=e,{logOptions:i,timeController:o,GC_Interval:l}=n;if(!i.progress&&!l)return;bt(e);const r=o.now();if(dt(e,r))return mt(t,r)}function R(e){return e.options.abortSignalExternal?.aborted??!1}function Y(e){return e.abortSignal.aborted}function ve(e,n){return e.state.debugMode?n:e.variantsIterator.next()}async function z(e,n){const{pool:t,state:i,options:o}=e,{parallel:l,logOptions:r}=o;let a=n??null;for(;!R(e);){const u=t&&!Y(e);let d=!1;u&&(t.hold(1)||await J.poolWait({pool:t,count:1,hold:!0}),d=!0);try{if(a==null&&(a=ve(e,a),a==null))break;const f=ye(e);if(S.isPromiseLike(f)&&await f,R(e)){a=null;continue}if(u)yt(e,a),d=!1;else{r.debug&&t&&Y(e)&&r.func("debug",`[test-variants] parallel aborted, running sequential: tests=${i.tests}`);const h=be(e,a);S.isPromiseLike(h)&&await h}a=null}finally{d&&t.release(1)}}t&&(await J.poolWait({pool:t,count:l,hold:!0}),t.release(l))}function vt(e){const{pool:n,state:t,options:i}=e,{logOptions:o}=i;if(n)return z(e);let l=null;for(;!R(e)&&(l=ve(e,l),l!=null);){const r=ye(e);if(S.isPromiseLike(r)){const u=l;return r.then(()=>z(e,u))}if(R(e))continue;o.debug&&Y(e)&&o.func("debug",`[test-variants] parallel aborted, running sequential: tests=${t.tests}`);const a=be(e,l);if(S.isPromiseLike(a))return a.then(()=>z(e))}}async function St(e,n,t,i){const o=ct(i),{store:l,logOptions:r,abortSignalExternal:a,findBestError:u,dontThrowIfError:d,timeController:f,parallel:h}=o,y=new H.AbortControllerFast,p=new H.AbortControllerFast,b=S.combineAbortSignals(a,y.signal),w=S.combineAbortSignals(b,p.signal),O={abortSignal:b,timeController:f},g={abortSignal:w,timeController:f};l&&await l.replay({testRun:e,variantsIterator:n,testOptions:O,findBestErrorEnabled:!!u});const x=h<=1?null:new J.Pool(h);pt(r,t.startMemory);const A={options:o,testRun:e,variantsIterator:n,testOptions:O,testOptionsParallel:g,abortControllerGlobal:y,abortControllerParallel:p,abortSignal:w,pool:x,state:t};he(A);try{await vt(A),w.throwIfAborted()}catch(N){throw y.abort(new T),N}return b.throwIfAborted(),y.abort(new T),ht(A),await re(1),at(t,n,d)}function wt(e){return function(t){return async function(o){const l=me(o?.log),r=tt(e,{onError:o?.onError,log:l}),a=o?.timeController??ee.timeControllerDefault,u=te(),d=Qe(a,u),f=o?.onModeChange;function h(p){d.pendingModeChange=p,f?.(p)}const y=lt({argsTemplates:t,getSeed:o?.getSeed,iterationModes:o?.iterationModes,equals:o?.findBestError?.equals,limitArgOnError:o?.findBestError?.limitArgOnError,includeErrorVariant:o?.findBestError?.includeErrorVariant,timeController:a,onModeChange:h,limitCompletionCount:o?.cycles??1,limitTests:o?.limitTests,limitTime:o?.limitTime});return St(r,y,d,o)}}}exports.createTestVariants=wt;
|