@flemist/test-variants 5.0.13 → 5.0.14

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../createTestVariants-B34VFl9m.js");exports.TimeoutError=e.TimeoutError;exports.createTestVariants=e.createTestVariants;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../createTestVariants-DHZ0gEE2.js");exports.TimeoutError=e.TimeoutError;exports.createTestVariants=e.createTestVariants;
@@ -1,4 +1,4 @@
1
- import { T as e, c as t } from "../createTestVariants-Bbto3Xye.mjs";
1
+ import { T as e, c as t } from "../createTestVariants-DGrAba6p.mjs";
2
2
  export {
3
3
  e as TimeoutError,
4
4
  t as createTestVariants
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../createTestVariants-B34VFl9m.js");exports.TimeoutError=e.TimeoutError;exports.createTestVariants=e.createTestVariants;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../createTestVariants-DHZ0gEE2.js");exports.TimeoutError=e.TimeoutError;exports.createTestVariants=e.createTestVariants;
@@ -1,4 +1,4 @@
1
- import { T as e, c as t } from "../createTestVariants-Bbto3Xye.mjs";
1
+ import { T as e, c as t } from "../createTestVariants-DGrAba6p.mjs";
2
2
  export {
3
3
  e as TimeoutError,
4
4
  t as createTestVariants
@@ -1,6 +1,6 @@
1
1
  import { IAbortSignalFast } from '@flemist/abort-controller-fast';
2
2
  import { TimeControllerMock } from '@flemist/time-controller';
3
- import { PromiseOrValue } from '@flemist/async-utils';
3
+ import { PromiseOrValue } from '@flemist/simple-utils';
4
4
  import { TestFuncResult } from '../../run/types';
5
5
  /**
6
6
  * Emulates test function call with sync/async behavior
@@ -1,5 +1,4 @@
1
- import { PromiseOrValue } from '@flemist/async-utils';
2
- import { Obj } from '@flemist/simple-utils';
1
+ import { Obj, PromiseOrValue } from '@flemist/simple-utils';
3
2
  import { ArgsWithSeed } from '../types';
4
3
  import { RunContext } from './RunContext';
5
4
  /**
@@ -1,5 +1,4 @@
1
- import { PromiseOrValue } from '@flemist/async-utils';
2
- import { Obj } from '@flemist/simple-utils';
1
+ import { Obj, PromiseOrValue } from '@flemist/simple-utils';
3
2
  import { RunContext } from './RunContext';
4
3
  /**
5
4
  * Main iteration loop with sync mode optimization.
@@ -1,5 +1,4 @@
1
- import { PromiseOrValue } from '@flemist/async-utils';
2
- import { Obj, RequiredNonNullable } from '@flemist/simple-utils';
1
+ import { Obj, PromiseOrValue, RequiredNonNullable } from '@flemist/simple-utils';
3
2
  import { TestVariantsTemplatesExt, VariantsIterator } from '../iterator/types';
4
3
  import { ArgsWithSeed, OnErrorCallback, OnTestEndCallback, OnTestStartCallback, SaveErrorVariantsOptions, TestVariantsState, TestVariantsLogOptions, TestVariantsResult, TestVariantsRunOptions } from '../types';
5
4
  /** Result of test run (internal format with separate sync/async counts) */
@@ -1,6 +1,5 @@
1
1
  import { IAbortSignalFast } from '@flemist/abort-controller-fast';
2
- import { PromiseOrValue } from '@flemist/async-utils';
3
- import { Obj } from '@flemist/simple-utils';
2
+ import { Obj, PromiseOrValue } from '@flemist/simple-utils';
4
3
  import { ITimeController } from '@flemist/time-controller';
5
4
  import { TestFuncResult } from './run/types';
6
5
  export type { TestVariantsTemplatesExt } from './iterator/types';
@@ -1,6 +1,5 @@
1
1
  import { timeControllerDefault as F } from "@flemist/time-controller";
2
- import { formatAny as ge, Subject as Je, deepCloneJsonLike as Xe } from "@flemist/simple-utils";
3
- import { combineAbortSignals as X, isPromiseLike as O, abortSignalToPromise as Ze, waitMicrotasks as Ke } from "@flemist/async-utils";
2
+ import { formatAny as ge, Subject as Je, combineAbortSignals as X, isPromiseLike as O, abortSignalToPromise as Xe, deepCloneJsonLike as Ze, waitMicrotasks as Ke } from "@flemist/simple-utils";
4
3
  import { AbortError as Qe, AbortControllerFast as Z } from "@flemist/abort-controller-fast";
5
4
  import { poolWait as ae, Pool as Ye } from "@flemist/time-limits";
6
5
  class et extends Error {
@@ -175,10 +174,10 @@ ${t.format(m)}`
175
174
  if (O(S)) {
176
175
  let x = null;
177
176
  return f && (x = g.subscribe(() => {
178
- Date.now() - v >= b && (E(), x());
177
+ Date.now() - v > b && (E(), x());
179
178
  }), S = Promise.race([
180
179
  S,
181
- Ze(f.signal)
180
+ Xe(f.signal)
182
181
  ])), S.then(
183
182
  (A) => {
184
183
  x?.();
@@ -188,7 +187,7 @@ ${t.format(m)}`
188
187
  (A) => (x?.(), s && !(A instanceof V) && s({ args: h, tests: y, error: A }), c(A, h, y))
189
188
  );
190
189
  }
191
- v != null && Date.now() - v >= b && (E(), f.signal.throwIfAborted());
190
+ v != null && Date.now() - v > b && (E(), f.signal.throwIfAborted());
192
191
  const C = ue(S, !1);
193
192
  return s && s({ args: h, tests: y, result: C }), C;
194
193
  } catch (S) {
@@ -458,7 +457,7 @@ function bt(e) {
458
457
  limitTests: g,
459
458
  limitTime: m
460
459
  } = e, h = e.timeController ?? F, y = {
461
- templates: Xe(r),
460
+ templates: Ze(r),
462
461
  extra: {}
463
462
  }, d = n == null || n.length === 0 ? ht : n, b = [];
464
463
  let v = null, M = null, f = 0, E = 0, S = !1, C = 0;
@@ -1066,7 +1065,7 @@ async function Ot(e, r, t, i) {
1066
1065
  }
1067
1066
  return b.throwIfAborted(), y.abort(new V()), It(S), await ne(1), yt(t, r, g);
1068
1067
  }
1069
- function Dt(e) {
1068
+ function Gt(e) {
1070
1069
  return function(t) {
1071
1070
  return async function(o) {
1072
1071
  const s = be(o?.log), n = ft(e, {
@@ -1099,5 +1098,5 @@ function Dt(e) {
1099
1098
  }
1100
1099
  export {
1101
1100
  et as T,
1102
- Dt as c
1101
+ Gt as c
1103
1102
  };
@@ -0,0 +1,4 @@
1
+ "use strict";const W=require("@flemist/time-controller"),E=require("@flemist/simple-utils"),B=require("@flemist/abort-controller-fast"),Z=require("@flemist/time-limits");class de extends Error{}function re(){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 He=1e3,U=[];function Je(e){return E.formatAny(e,{pretty:!0,maxDepth:5,maxItems:50})}function Xe(...e){const r=e.map(t=>typeof t=="string"?t:Je(t)).join(" ");U.push(r),U.length>He&&U.shift(),console.log(r)}function Ze(){return U.join(`
2
+ `)}globalThis.__getStressTestLogLast=Ze;const ge=(e,r)=>{Xe(r)},pe=e=>E.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:ge,format:pe},Ke={start:!1,progress:!1,completed:!1,error:!1,modeChange:!1,debug:!1,func:ge,format:pe};function he(e){return e===!1?Ke: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 Qe(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 Ye{_timeController;_subject;_interval;_timer;constructor(r,t){this._interval=r,this._timeController=t??W.timeControllerDefault,this._subject=new E.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 et=50,tt=5;function rt(e,r){return e==null?null:typeof e=="number"?e:e(r)??null}function ae(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 nt(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>et&&a<tt){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 Ye(100);return function(h,y,d){i&&i({args:h,tests:y});const b=rt(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 de(`[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=ae(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=ae(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 ue(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 be(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 K(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 it(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 ot(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?be(e):K(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)?K(e):!0}function k(e){return e.mode==="forward"||e.mode==="backward"}function st(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 lt(e,r,t){for(const o in r)if(Object.prototype.hasOwnProperty.call(r,o)){if(o==="seed")continue;st(e,r,o,t)}}function ce(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 at=[{mode:"forward"}];function ut(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:E.deepCloneJsonLike(r),extra:{}},d=n==null||n.length===0?at: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,oe(),we())}function O(){for(let l=0,u=d.length;l<u;l++)b.push(G())}function G(){return{navigationState:ue(y,t??null,o??null,i??null),cycleCount:0,completedCount:0,testsInLastTurn:0,tryNextVariantAttempts:0,startTime:null}}function we(){v=ue(y,t??null,!1,!1)}function oe(){a?.({mode:d[f],modeIndex:f,tests:w})}function xe(l){T(),ce(y.templates,l)&&lt(y,l,t)}function se(l,u){return T(),ce(y.templates,l)?(v.limitArgOnError=u?.limitArg??o??null,v.includeErrorVariant=u?.includeLimit??i??!1,it(v,l)):null}function Te(l){const u=l?.args;if(u==null)return;T();const p=se(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 J=b[x].navigationState;J.argLimits=p}}}function Ce(){return T(),Me()}function Me(){for(;;){if(!Ie())return null;for(;;){const l=De();if(l!=null)return b[f].testsInLastTurn++,w++,l;if(_e()){if(!Ne())return null;Ge();break}}}}function Ie(){return!(Ve()||Ae()||D()&&(Oe()||!Le())||!Pe())}function Ve(){return g!=null&&w>=g}function Ae(){return m!=null&&h.now()-A>=m}function Oe(){if(!D())throw new Error("Unexpected behavior");return c!=null&&c<=0}function Le(){if(!D())throw new Error("Unexpected behavior");for(let l=0,u=d.length;l<u;l++)if(P(d[l])&&z(l))return!0;return!1}function Pe(){for(let l=0,u=d.length;l<u;l++)if(z(l))return!0;return!1}function _e(){f++;const l=f>=d.length;return l&&(f=0),oe(),l}function Ne(){if(D()){const l=$e();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 $e(){let l=!1,u=1/0;for(let p=0,x=b.length;p<x;p++){const q=b[p],J=d[p];k(J)&&(l=!0,z(p)&&q.completedCount<u&&(u=q.completedCount))}if(!l)throw new Error("Unexpected behavior");return u}function z(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 Ge(){f=0;for(let l=0,u=b.length;l<u;l++){const p=b[l];p.testsInLastTurn=0,p.startTime=null}}function De(){let l=0;for(;l<2;){if(!qe())return null;const u=Fe();if(u!=null)return u;if(P(d[f])&&Re())return null;l++}return null}function qe(){const l=d[f];return!(ke()||Ue()||P(l)&&!Be(f))}function ke(){const l=d[f],u=b[f];return l.limitTests!=null&&u.testsInLastTurn>=l.limitTests}function Ue(){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 Be(l){const u=d[l],p=b[l];if(!P(u))throw new Error("Unexpected behavior");return p.cycleCount<(u.cycles??1)}function Re(){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 Fe(){const l=d[f],u=b[f],p=u.navigationState;if($(l)){if(H())return null;const x=je();if(x!=null)return u.startTime==null&&(u.startTime=h.now()),x}return ze()?(u.tryNextVariantAttempts=0,$(l)&&We(),u.startTime==null&&(u.startTime=h.now()),le(p.args)):(u.tryNextVariantAttempts++,null)}function je(){const l=d[f],p=b[f].navigationState;if(!$(l))throw new Error("Unexpected behavior");if(H())throw new Error("Unexpected behavior");const x=l.attemptsPerVariant??1;return p.attempts>0&&p.attempts<x?L(p)?null:(p.attempts++,le(p.args)):null}function We(){const l=d[f],p=b[f].navigationState;if(!$(l))throw new Error("Unexpected behavior");if(H())throw new Error("Unexpected behavior");p.attempts=1}function $(l){return k(l)}function H(){const l=d[f];if(!$(l))throw new Error("Unexpected behavior");return(l.attemptsPerVariant??1)<=0}function ze(){const l=d[f],p=b[f].navigationState;switch(l.mode){case"forward":return be(p);case"backward":return K(p);case"random":return ot(p);default:throw new Error(`Unknown mode: ${l.mode}`)}}function le(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:se,extendTemplates:xe,addLimit:Te,next:Ce}}function ne(e){if(e==null||e<=0)throw new Error(`Iterations = ${e}`);e--;const r=E.waitMicrotasks().then(()=>e);return e<=0?r:r.then(ne)}function ct(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 fe=2**31;function ft(e){if(e==null)return{parallel:1,sequentialOnError:!1};if(typeof e=="boolean")return{parallel:e?fe: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=fe:typeof r=="number"&&r>0&&(t=r),{parallel:t,sequentialOnError:e.sequentialOnError??!1}}function mt(e){const r=e?.saveErrorVariants,t=r&&e.createSaveErrorVariantsStore?e.createSaveErrorVariantsStore(r):null,o=e?.findBestError,{parallel:i,sequentialOnError:s}=ft(e?.parallel);return{store:t,GC_Iterations:e?.GC_Iterations??1e6,GC_IterationsAsync:e?.GC_IterationsAsync??1e4,GC_Interval:e?.GC_Interval??1e3,logOptions:he(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 dt(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 me(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 gt(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 pt(e,r){e.prevGcIterations=e.iterations,e.prevGcIterationsAsync=e.iterationsAsync,e.prevGcTime=r,await ne(1)}function ie(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 Q(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 ht(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=${ie(e.limitTime)}`),e.limitTests!=null&&(t+=`, limitTests=${e.limitTests}`),t}function ye(e,r){const t=e-r,o=t>=0?"+":"";return`${Q(e)} (${o}${Q(t)})`}function bt(e,r){if(!e.start)return;let t="[test-variants] start";r!=null&&(t+=`, memory: ${Q(r)}`),e.func("start",t)}function yt(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} (${ie(s)}), async: ${t.iterationsAsync}`;if(t.startMemory!=null){const a=re();a!=null&&(n+=`, memory: ${ye(a,t.startMemory)}`)}o.func("completed",n)}function ve(e){const{options:r,state:t}=e,{logOptions:o}=r,i=t.pendingModeChange;!o.modeChange||i==null||(o.func("modeChange",`[test-variants] ${ht(i.mode,i.modeIndex)}`),t.pendingModeChange=null)}function vt(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;ve(e);const n=s-t.startTime;let a=`[test-variants] tests: ${t.tests} (${ie(n)}), async: ${t.iterationsAsync}`;if(t.prevLogMemory!=null){const c=re();c!=null&&(a+=`, memory: ${ye(c,t.prevLogMemory)}`,t.prevLogMemory=c)}return o.func("progress",a),t.prevLogTime=s,!0}function Y(e,r){e.debugMode=!1,r&&(e.iterationsAsync+=r.iterationsAsync,e.iterations+=r.iterationsSync+r.iterationsAsync)}function ee(e){e.state.debugMode=!0,e.abortControllerParallel.abort(new V)}function Se(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){ee(e);return}Y(i,a)},a=>me(e,r,a,s));if(!n){ee(e);return}Y(i,n)}catch(n){return n instanceof V?void 0:me(e,r,n,s)}}function St(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){ee(e);return}Y(n,c)}catch(c){if(c instanceof V)return;dt(e,r,c,a)}finally{t.release(1)}})()}function Ee(e){const{options:r,state:t}=e,{logOptions:o,timeController:i,GC_Interval:s}=r;if(!o.progress&&!s)return;vt(e);const n=i.now();if(gt(e,n))return pt(t,n)}function j(e){return e.options.abortSignalExternal?.aborted??!1}function te(e){return e.abortSignal.aborted}async function X(e,r){const{pool:t,state:o,options:i}=e,{parallel:s,logOptions:n}=i;let a=null;for(;!j(e);){const c=t&&!te(e);let g=!1;c&&(t.hold(1)||await Z.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=Ee(e);if(E.isPromiseLike(m)&&await m,j(e))continue;if(c)St(e,a),g=!1;else{n.debug&&t&&te(e)&&n.func("debug",`[test-variants] parallel aborted, running sequential: tests=${o.tests}`);const h=Se(e,a);E.isPromiseLike(h)&&await h}}finally{g&&t.release(1)}}t&&(await Z.poolWait({pool:t,count:s,hold:!0}),t.release(s))}function Et(e){const{pool:r,state:t,options:o}=e,{logOptions:i}=o;if(r)return X(e);let s=null;for(;!j(e)&&(e.state.debugMode||(s=e.variantsIterator.next()),s!=null);){const n=Ee(e);if(E.isPromiseLike(n))return n.then(()=>X(e,s));if(j(e))continue;i.debug&&te(e)&&i.func("debug",`[test-variants] parallel aborted, running sequential: tests=${t.tests}`);const a=Se(e,s);if(E.isPromiseLike(a))return a.then(()=>X(e))}}async function wt(e,r,t,o){const i=mt(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 Z.Pool(h);bt(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};ve(S);try{await Et(S),v.throwIfAborted()}catch(A){throw y.abort(new V),A}return b.throwIfAborted(),y.abort(new V),yt(S),await ne(1),ct(t,r,g)}function xt(e){return function(t){return async function(i){const s=he(i?.log),n=nt(e,{onStart:i?.onStart,onEnd:i?.onEnd,onError:i?.onError,log:s,pauseDebuggerOnError:i?.pauseDebuggerOnError,timeout:i?.timeout}),a=i?.timeController??W.timeControllerDefault,c=re(),g=Qe(a,c),m=i?.onModeChange;function h(d){g.pendingModeChange=d,m?.(d)}const y=ut({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 wt(n,y,g,i)}}}exports.TimeoutError=de;exports.createTestVariants=xt;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("../createTestVariants-B34VFl9m.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=_;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("../createTestVariants-DHZ0gEE2.js"),F=require("path"),m=require("@flemist/simple-utils"),O=require("@flemist/simple-utils/node"),x=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 g=v(F),u=v(x);async function P(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=>g.join(e,n))}async function b(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 A(e){const t=Math.random().toString(36).substring(2);return m.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(g.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=g.resolve(t.dir,t.getFilePath?.({sessionDate:s})??A({sessionDate:s}))}async save(t){m.deepEqualJsonLike(t,this.lastSavedArgs)||(this.lastSavedArgs={...t},await O.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,w=new Map;function d(i){let o=w.get(i);return o===void 0&&(o=r.calcIndexes(i,{includeLimit:!1,limitArg:E}),w.set(i,o)),o}const y=await P(this.options.dir),f=[];for(let i=0,o=y.length;i<o;i++){const p=y[i],l=await b(p,this.options.jsonToArgs);V&&r.extendTemplates(l),d(l)!=null&&f.push(l)}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 l=0;l<S;l++)try{const c=s(p,0,n);m.isPromiseLike(c)&&await c}catch(c){if(h&&a){r.addLimit({args:p,error:c});break}throw c}}}}function k(e){return new N(e)}function q(e){const t=j.createTestVariants(e);return function(r){const n=t(r);return function(h){return n({...h,createSaveErrorVariantsStore:k})}}}exports.createTestVariants=q;
@@ -1,7 +1,6 @@
1
- import { c as x } from "../createTestVariants-Bbto3Xye.mjs";
1
+ import { c as x } from "../createTestVariants-DGrAba6p.mjs";
2
2
  import * as d from "path";
3
- import { isPromiseLike as F } from "@flemist/async-utils";
4
- import { formatDateFileName as S, deepEqualJsonLike as A } from "@flemist/simple-utils";
3
+ import { formatDateFileName as F, deepEqualJsonLike as S, isPromiseLike as A } from "@flemist/simple-utils";
5
4
  import { fileLock as T } from "@flemist/simple-utils/node";
6
5
  import * as f from "fs";
7
6
  async function P(r) {
@@ -32,7 +31,7 @@ async function j(r, t) {
32
31
  }
33
32
  function L(r) {
34
33
  const t = Math.random().toString(36).substring(2);
35
- return S(r.sessionDate, "UTC") + "_" + t + ".json";
34
+ return F(r.sessionDate, "UTC") + "_" + t + ".json";
36
35
  }
37
36
  async function N(r, t, n) {
38
37
  let e;
@@ -72,7 +71,7 @@ class k {
72
71
  );
73
72
  }
74
73
  async save(t) {
75
- A(t, this.lastSavedArgs) || (this.lastSavedArgs = { ...t }, await T({
74
+ S(t, this.lastSavedArgs) || (this.lastSavedArgs = { ...t }, await T({
76
75
  filePath: this.filePath,
77
76
  func: () => N(t, this.filePath, this.options.argsToJson)
78
77
  }));
@@ -103,7 +102,7 @@ class k {
103
102
  for (let l = 0; l < y; l++)
104
103
  try {
105
104
  const c = n(h, 0, s);
106
- F(c) && await c;
105
+ A(c) && await c;
107
106
  } catch (c) {
108
107
  if (p && o) {
109
108
  e.addLimit({
@@ -120,7 +119,7 @@ class k {
120
119
  function D(r) {
121
120
  return new k(r);
122
121
  }
123
- function C(r) {
122
+ function B(r) {
124
123
  const t = x(r);
125
124
  return function(e) {
126
125
  const s = t(e);
@@ -133,5 +132,5 @@ function C(r) {
133
132
  };
134
133
  }
135
134
  export {
136
- C as createTestVariants
135
+ B as createTestVariants
137
136
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flemist/test-variants",
3
- "version": "5.0.13",
3
+ "version": "5.0.14",
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/async-utils": "^1.2.8",
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;