You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
647 lines
21 KiB
647 lines
21 KiB
2 years ago
|
import { performance } from 'perf_hooks';
|
||
|
import { g as generateHash, c as calculateSuiteHash, s as someTasksAreOnly, i as interpretTaskModes, t as takeCoverageInsideWorker, p as pLimit } from './chunk-integrations-coverage.44413252.js';
|
||
|
import { f as clearCollectorContext, h as defaultSuite, j as setHooks, k as getHooks, l as collectorContext, m as getBenchOptions, n as getFn, o as setState, p as getSnapshotClient, G as GLOBAL_EXPECT, q as getState } from './chunk-runtime-chain.6df5a66b.js';
|
||
|
import { r as resetRunOnceCounter, i as index, v as vi, s as setCurrentTest } from './chunk-utils-import.2baa69a9.js';
|
||
|
import { g as getWorkerState, R as RealDate, t as toArray, k as relativePath, h as isRunningInBenchmark, p as partitionSuiteChildren, l as shuffle, q as hasTests, u as hasFailed, v as createDefer, e as getFullName } from './chunk-mock-date.a1c85759.js';
|
||
|
import { r as rpc } from './chunk-runtime-rpc.7f83c8a9.js';
|
||
|
import { p as processError } from './chunk-runtime-error.fad2c32b.js';
|
||
|
import { installSourcemapsSupport } from 'vite-node/source-map';
|
||
|
import { e as environments } from './chunk-env-node.b3664da2.js';
|
||
|
import { i as isNode, a as isBrowser } from './chunk-utils-env.b861e3a0.js';
|
||
|
import { b as safeClearTimeout, s as safeSetTimeout } from './chunk-utils-timers.52534f96.js';
|
||
|
|
||
|
let globalSetup = false;
|
||
|
async function setupGlobalEnv(config) {
|
||
|
resetRunOnceCounter();
|
||
|
Object.defineProperty(globalThis, "__vitest_index__", {
|
||
|
value: index,
|
||
|
enumerable: false
|
||
|
});
|
||
|
setupDefines(config.defines);
|
||
|
if (globalSetup)
|
||
|
return;
|
||
|
globalSetup = true;
|
||
|
if (isNode) {
|
||
|
const state = getWorkerState();
|
||
|
installSourcemapsSupport({
|
||
|
getSourceMap: (source) => state.moduleCache.getSourceMap(source)
|
||
|
});
|
||
|
await setupConsoleLogSpy();
|
||
|
}
|
||
|
if (config.globals)
|
||
|
(await import('./chunk-integrations-globals.3dfaeb99.js')).registerApiGlobally();
|
||
|
}
|
||
|
function setupDefines(defines) {
|
||
|
for (const key in defines)
|
||
|
globalThis[key] = defines[key];
|
||
|
}
|
||
|
async function setupConsoleLogSpy() {
|
||
|
const stdoutBuffer = /* @__PURE__ */ new Map();
|
||
|
const stderrBuffer = /* @__PURE__ */ new Map();
|
||
|
const timers = /* @__PURE__ */ new Map();
|
||
|
const unknownTestId = "__vitest__unknown_test__";
|
||
|
const { Writable } = await import('node:stream');
|
||
|
const { Console } = await import('node:console');
|
||
|
function schedule(taskId) {
|
||
|
const timer = timers.get(taskId);
|
||
|
const { stdoutTime, stderrTime } = timer;
|
||
|
safeClearTimeout(timer.timer);
|
||
|
timer.timer = safeSetTimeout(() => {
|
||
|
if (stderrTime < stdoutTime) {
|
||
|
sendStderr(taskId);
|
||
|
sendStdout(taskId);
|
||
|
} else {
|
||
|
sendStdout(taskId);
|
||
|
sendStderr(taskId);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
function sendStdout(taskId) {
|
||
|
const buffer = stdoutBuffer.get(taskId);
|
||
|
if (!buffer)
|
||
|
return;
|
||
|
const content = buffer.map((i) => String(i)).join("");
|
||
|
if (!content.trim())
|
||
|
return;
|
||
|
const timer = timers.get(taskId);
|
||
|
rpc().onUserConsoleLog({
|
||
|
type: "stdout",
|
||
|
content,
|
||
|
taskId,
|
||
|
time: timer.stdoutTime || RealDate.now(),
|
||
|
size: buffer.length
|
||
|
});
|
||
|
stdoutBuffer.set(taskId, []);
|
||
|
timer.stdoutTime = 0;
|
||
|
}
|
||
|
function sendStderr(taskId) {
|
||
|
const buffer = stderrBuffer.get(taskId);
|
||
|
if (!buffer)
|
||
|
return;
|
||
|
const content = buffer.map((i) => String(i)).join("");
|
||
|
if (!content.trim())
|
||
|
return;
|
||
|
const timer = timers.get(taskId);
|
||
|
rpc().onUserConsoleLog({
|
||
|
type: "stderr",
|
||
|
content,
|
||
|
taskId,
|
||
|
time: timer.stderrTime || RealDate.now(),
|
||
|
size: buffer.length
|
||
|
});
|
||
|
stderrBuffer.set(taskId, []);
|
||
|
timer.stderrTime = 0;
|
||
|
}
|
||
|
const stdout = new Writable({
|
||
|
write(data, encoding, callback) {
|
||
|
var _a, _b;
|
||
|
const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
|
||
|
let timer = timers.get(id);
|
||
|
if (timer) {
|
||
|
timer.stdoutTime = timer.stdoutTime || RealDate.now();
|
||
|
} else {
|
||
|
timer = { stdoutTime: RealDate.now(), stderrTime: RealDate.now(), timer: 0 };
|
||
|
timers.set(id, timer);
|
||
|
}
|
||
|
let buffer = stdoutBuffer.get(id);
|
||
|
if (!buffer) {
|
||
|
buffer = [];
|
||
|
stdoutBuffer.set(id, buffer);
|
||
|
}
|
||
|
buffer.push(data);
|
||
|
schedule(id);
|
||
|
callback();
|
||
|
}
|
||
|
});
|
||
|
const stderr = new Writable({
|
||
|
write(data, encoding, callback) {
|
||
|
var _a, _b;
|
||
|
const id = ((_b = (_a = getWorkerState()) == null ? void 0 : _a.current) == null ? void 0 : _b.id) ?? unknownTestId;
|
||
|
let timer = timers.get(id);
|
||
|
if (timer) {
|
||
|
timer.stderrTime = timer.stderrTime || RealDate.now();
|
||
|
} else {
|
||
|
timer = { stderrTime: RealDate.now(), stdoutTime: RealDate.now(), timer: 0 };
|
||
|
timers.set(id, timer);
|
||
|
}
|
||
|
let buffer = stderrBuffer.get(id);
|
||
|
if (!buffer) {
|
||
|
buffer = [];
|
||
|
stderrBuffer.set(id, buffer);
|
||
|
}
|
||
|
buffer.push(data);
|
||
|
schedule(id);
|
||
|
callback();
|
||
|
}
|
||
|
});
|
||
|
globalThis.console = new Console({
|
||
|
stdout,
|
||
|
stderr,
|
||
|
colorMode: true,
|
||
|
groupIndentation: 2
|
||
|
});
|
||
|
}
|
||
|
async function loadEnvironment(name) {
|
||
|
const pkg = await import(`vitest-environment-${name}`);
|
||
|
if (!pkg || !pkg.default || typeof pkg.default !== "object" || typeof pkg.default.setup !== "function") {
|
||
|
throw new Error(
|
||
|
`Environment "${name}" is not a valid environment. Package "vitest-environment-${name}" should have default export with "setup" method.`
|
||
|
);
|
||
|
}
|
||
|
return pkg.default;
|
||
|
}
|
||
|
async function withEnv(name, options, fn) {
|
||
|
const config = environments[name] || await loadEnvironment(name);
|
||
|
const env = await config.setup(globalThis, options);
|
||
|
try {
|
||
|
await fn();
|
||
|
} finally {
|
||
|
await env.teardown(globalThis);
|
||
|
}
|
||
|
}
|
||
|
async function runSetupFiles(config) {
|
||
|
const files = toArray(config.setupFiles);
|
||
|
await Promise.all(
|
||
|
files.map(async (fsPath) => {
|
||
|
getWorkerState().moduleCache.delete(fsPath);
|
||
|
await import(fsPath);
|
||
|
})
|
||
|
);
|
||
|
}
|
||
|
|
||
|
const now$1 = Date.now;
|
||
|
async function collectTests(paths, config) {
|
||
|
const files = [];
|
||
|
const browserHashMap = getWorkerState().browserHashMap;
|
||
|
async function importFromBrowser(filepath) {
|
||
|
const match = filepath.match(/^(\w:\/)/);
|
||
|
const hash = browserHashMap.get(filepath);
|
||
|
if (match)
|
||
|
return await import(`/@fs/${filepath.slice(match[1].length)}?v=${hash}`);
|
||
|
else
|
||
|
return await import(`${filepath}?v=${hash}`);
|
||
|
}
|
||
|
for (const filepath of paths) {
|
||
|
const path = relativePath(config.root, filepath);
|
||
|
const file = {
|
||
|
id: generateHash(path),
|
||
|
name: path,
|
||
|
type: "suite",
|
||
|
mode: "run",
|
||
|
filepath,
|
||
|
tasks: [],
|
||
|
projectName: config.name
|
||
|
};
|
||
|
clearCollectorContext();
|
||
|
try {
|
||
|
const setupStart = now$1();
|
||
|
await runSetupFiles(config);
|
||
|
const collectStart = now$1();
|
||
|
file.setupDuration = collectStart - setupStart;
|
||
|
if (config.browser && isBrowser)
|
||
|
await importFromBrowser(filepath);
|
||
|
else
|
||
|
await import(filepath);
|
||
|
const defaultTasks = await defaultSuite.collect(file);
|
||
|
setHooks(file, getHooks(defaultTasks));
|
||
|
for (const c of [...defaultTasks.tasks, ...collectorContext.tasks]) {
|
||
|
if (c.type === "test") {
|
||
|
file.tasks.push(c);
|
||
|
} else if (c.type === "benchmark") {
|
||
|
file.tasks.push(c);
|
||
|
} else if (c.type === "suite") {
|
||
|
file.tasks.push(c);
|
||
|
} else if (c.type === "collector") {
|
||
|
const suite = await c.collect(file);
|
||
|
if (suite.name || suite.tasks.length)
|
||
|
file.tasks.push(suite);
|
||
|
}
|
||
|
}
|
||
|
file.collectDuration = now$1() - collectStart;
|
||
|
} catch (e) {
|
||
|
const error = processError(e);
|
||
|
file.result = {
|
||
|
state: "fail",
|
||
|
error,
|
||
|
errors: [error]
|
||
|
};
|
||
|
if (config.browser)
|
||
|
console.error(e);
|
||
|
}
|
||
|
calculateSuiteHash(file);
|
||
|
const hasOnlyTasks = someTasksAreOnly(file);
|
||
|
interpretTaskModes(file, config.testNamePattern, hasOnlyTasks, false, config.allowOnly);
|
||
|
files.push(file);
|
||
|
}
|
||
|
return files;
|
||
|
}
|
||
|
|
||
|
async function importTinybench() {
|
||
|
if (!globalThis.EventTarget)
|
||
|
await import('./vendor-index.534e612c.js').then(function (n) { return n.i; });
|
||
|
return await import('tinybench');
|
||
|
}
|
||
|
const now = Date.now;
|
||
|
function updateSuiteHookState(suite, name, state) {
|
||
|
var _a;
|
||
|
if (!suite.result)
|
||
|
suite.result = { state: "run" };
|
||
|
if (!((_a = suite.result) == null ? void 0 : _a.hooks))
|
||
|
suite.result.hooks = {};
|
||
|
const suiteHooks = suite.result.hooks;
|
||
|
if (suiteHooks) {
|
||
|
suiteHooks[name] = state;
|
||
|
updateTask(suite);
|
||
|
}
|
||
|
}
|
||
|
function getSuiteHooks(suite, name, sequence) {
|
||
|
const hooks = getHooks(suite)[name];
|
||
|
if (sequence === "stack" && (name === "afterAll" || name === "afterEach"))
|
||
|
return hooks.slice().reverse();
|
||
|
return hooks;
|
||
|
}
|
||
|
async function callSuiteHook(suite, currentTask, name, args) {
|
||
|
const callbacks = [];
|
||
|
if (name === "beforeEach" && suite.suite) {
|
||
|
callbacks.push(
|
||
|
...await callSuiteHook(suite.suite, currentTask, name, args)
|
||
|
);
|
||
|
}
|
||
|
updateSuiteHookState(currentTask, name, "run");
|
||
|
const state = getWorkerState();
|
||
|
const sequence = state.config.sequence.hooks;
|
||
|
const hooks = getSuiteHooks(suite, name, sequence);
|
||
|
if (sequence === "parallel") {
|
||
|
callbacks.push(...await Promise.all(hooks.map((fn) => fn(...args))));
|
||
|
} else {
|
||
|
for (const hook of hooks)
|
||
|
callbacks.push(await hook(...args));
|
||
|
}
|
||
|
updateSuiteHookState(currentTask, name, "pass");
|
||
|
if (name === "afterEach" && suite.suite) {
|
||
|
callbacks.push(
|
||
|
...await callSuiteHook(suite.suite, currentTask, name, args)
|
||
|
);
|
||
|
}
|
||
|
return callbacks;
|
||
|
}
|
||
|
const packs = /* @__PURE__ */ new Map();
|
||
|
let updateTimer;
|
||
|
let previousUpdate;
|
||
|
function updateTask(task) {
|
||
|
packs.set(task.id, task.result);
|
||
|
safeClearTimeout(updateTimer);
|
||
|
updateTimer = safeSetTimeout(() => {
|
||
|
previousUpdate = sendTasksUpdate();
|
||
|
}, 10);
|
||
|
}
|
||
|
async function sendTasksUpdate() {
|
||
|
safeClearTimeout(updateTimer);
|
||
|
await previousUpdate;
|
||
|
if (packs.size) {
|
||
|
const p = rpc().onTaskUpdate(Array.from(packs));
|
||
|
packs.clear();
|
||
|
return p;
|
||
|
}
|
||
|
}
|
||
|
const callCleanupHooks = async (cleanups) => {
|
||
|
await Promise.all(cleanups.map(async (fn) => {
|
||
|
if (typeof fn !== "function")
|
||
|
return;
|
||
|
await fn();
|
||
|
}));
|
||
|
};
|
||
|
async function runTest(test) {
|
||
|
var _a, _b, _c;
|
||
|
if (test.mode !== "run") {
|
||
|
const { getSnapshotClient: getSnapshotClient2 } = await import('./chunk-runtime-chain.6df5a66b.js').then(function (n) { return n.u; });
|
||
|
getSnapshotClient2().skipTestSnapshots(test);
|
||
|
return;
|
||
|
}
|
||
|
if (((_a = test.result) == null ? void 0 : _a.state) === "fail") {
|
||
|
updateTask(test);
|
||
|
return;
|
||
|
}
|
||
|
const start = now();
|
||
|
test.result = {
|
||
|
state: "run",
|
||
|
startTime: start
|
||
|
};
|
||
|
updateTask(test);
|
||
|
clearModuleMocks();
|
||
|
setCurrentTest(test);
|
||
|
if (isNode) {
|
||
|
const { getSnapshotClient: getSnapshotClient2 } = await import('./chunk-runtime-chain.6df5a66b.js').then(function (n) { return n.u; });
|
||
|
await getSnapshotClient2().setTest(test);
|
||
|
}
|
||
|
const workerState = getWorkerState();
|
||
|
workerState.current = test;
|
||
|
const retry = test.retry || 1;
|
||
|
for (let retryCount = 0; retryCount < retry; retryCount++) {
|
||
|
let beforeEachCleanups = [];
|
||
|
try {
|
||
|
setState({
|
||
|
assertionCalls: 0,
|
||
|
isExpectingAssertions: false,
|
||
|
isExpectingAssertionsError: null,
|
||
|
expectedAssertionsNumber: null,
|
||
|
expectedAssertionsNumberErrorGen: null,
|
||
|
testPath: (_b = test.suite.file) == null ? void 0 : _b.filepath,
|
||
|
currentTestName: getFullName(test),
|
||
|
snapshotState: getSnapshotClient().snapshotState
|
||
|
}, globalThis[GLOBAL_EXPECT]);
|
||
|
beforeEachCleanups = await callSuiteHook(test.suite, test, "beforeEach", [test.context, test.suite]);
|
||
|
test.result.retryCount = retryCount;
|
||
|
await getFn(test)();
|
||
|
const {
|
||
|
assertionCalls,
|
||
|
expectedAssertionsNumber,
|
||
|
expectedAssertionsNumberErrorGen,
|
||
|
isExpectingAssertions,
|
||
|
isExpectingAssertionsError
|
||
|
} = test.context._local ? test.context.expect.getState() : getState(globalThis[GLOBAL_EXPECT]);
|
||
|
if (expectedAssertionsNumber !== null && assertionCalls !== expectedAssertionsNumber)
|
||
|
throw expectedAssertionsNumberErrorGen();
|
||
|
if (isExpectingAssertions === true && assertionCalls === 0)
|
||
|
throw isExpectingAssertionsError;
|
||
|
test.result.state = "pass";
|
||
|
} catch (e) {
|
||
|
const error = processError(e);
|
||
|
test.result.state = "fail";
|
||
|
test.result.error = error;
|
||
|
test.result.errors = [error];
|
||
|
}
|
||
|
try {
|
||
|
await callSuiteHook(test.suite, test, "afterEach", [test.context, test.suite]);
|
||
|
await callCleanupHooks(beforeEachCleanups);
|
||
|
} catch (e) {
|
||
|
const error = processError(e);
|
||
|
test.result.state = "fail";
|
||
|
test.result.error = error;
|
||
|
test.result.errors = [error];
|
||
|
}
|
||
|
if (test.result.state === "pass")
|
||
|
break;
|
||
|
updateTask(test);
|
||
|
}
|
||
|
if (test.result.state === "fail")
|
||
|
await Promise.all(((_c = test.onFailed) == null ? void 0 : _c.map((fn) => fn(test.result))) || []);
|
||
|
if (test.fails) {
|
||
|
if (test.result.state === "pass") {
|
||
|
const error = processError(new Error("Expect test to fail"));
|
||
|
test.result.state = "fail";
|
||
|
test.result.error = error;
|
||
|
test.result.errors = [error];
|
||
|
} else {
|
||
|
test.result.state = "pass";
|
||
|
test.result.error = void 0;
|
||
|
test.result.errors = void 0;
|
||
|
}
|
||
|
}
|
||
|
if (isBrowser && test.result.error)
|
||
|
console.error(test.result.error.message, test.result.error.stackStr);
|
||
|
setCurrentTest(void 0);
|
||
|
if (isNode) {
|
||
|
const { getSnapshotClient: getSnapshotClient2 } = await import('./chunk-runtime-chain.6df5a66b.js').then(function (n) { return n.u; });
|
||
|
getSnapshotClient2().clearTest();
|
||
|
}
|
||
|
test.result.duration = now() - start;
|
||
|
if (workerState.config.logHeapUsage && isNode)
|
||
|
test.result.heap = process.memoryUsage().heapUsed;
|
||
|
workerState.current = void 0;
|
||
|
updateTask(test);
|
||
|
}
|
||
|
function markTasksAsSkipped(suite) {
|
||
|
suite.tasks.forEach((t) => {
|
||
|
t.mode = "skip";
|
||
|
t.result = { ...t.result, state: "skip" };
|
||
|
updateTask(t);
|
||
|
if (t.type === "suite")
|
||
|
markTasksAsSkipped(t);
|
||
|
});
|
||
|
}
|
||
|
async function runSuite(suite) {
|
||
|
var _a;
|
||
|
if (((_a = suite.result) == null ? void 0 : _a.state) === "fail") {
|
||
|
markTasksAsSkipped(suite);
|
||
|
updateTask(suite);
|
||
|
return;
|
||
|
}
|
||
|
const start = now();
|
||
|
suite.result = {
|
||
|
state: "run",
|
||
|
startTime: start
|
||
|
};
|
||
|
updateTask(suite);
|
||
|
const workerState = getWorkerState();
|
||
|
if (suite.mode === "skip") {
|
||
|
suite.result.state = "skip";
|
||
|
} else if (suite.mode === "todo") {
|
||
|
suite.result.state = "todo";
|
||
|
} else {
|
||
|
try {
|
||
|
const beforeAllCleanups = await callSuiteHook(suite, suite, "beforeAll", [suite]);
|
||
|
if (isRunningInBenchmark()) {
|
||
|
await runBenchmarkSuite(suite);
|
||
|
} else {
|
||
|
for (let tasksGroup of partitionSuiteChildren(suite)) {
|
||
|
if (tasksGroup[0].concurrent === true) {
|
||
|
const mutex = pLimit(workerState.config.maxConcurrency);
|
||
|
await Promise.all(tasksGroup.map((c) => mutex(() => runSuiteChild(c))));
|
||
|
} else {
|
||
|
const { sequence } = workerState.config;
|
||
|
if (sequence.shuffle || suite.shuffle) {
|
||
|
const suites = tasksGroup.filter((group) => group.type === "suite");
|
||
|
const tests = tasksGroup.filter((group) => group.type === "test");
|
||
|
const groups = shuffle([suites, tests], sequence.seed);
|
||
|
tasksGroup = groups.flatMap((group) => shuffle(group, sequence.seed));
|
||
|
}
|
||
|
for (const c of tasksGroup)
|
||
|
await runSuiteChild(c);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
await callSuiteHook(suite, suite, "afterAll", [suite]);
|
||
|
await callCleanupHooks(beforeAllCleanups);
|
||
|
} catch (e) {
|
||
|
const error = processError(e);
|
||
|
suite.result.state = "fail";
|
||
|
suite.result.error = error;
|
||
|
suite.result.errors = [error];
|
||
|
}
|
||
|
}
|
||
|
suite.result.duration = now() - start;
|
||
|
if (workerState.config.logHeapUsage && isNode)
|
||
|
suite.result.heap = process.memoryUsage().heapUsed;
|
||
|
if (suite.mode === "run") {
|
||
|
if (!hasTests(suite)) {
|
||
|
suite.result.state = "fail";
|
||
|
if (!suite.result.error) {
|
||
|
const error = processError(new Error(`No test found in suite ${suite.name}`));
|
||
|
suite.result.error = error;
|
||
|
suite.result.errors = [error];
|
||
|
}
|
||
|
} else if (hasFailed(suite)) {
|
||
|
suite.result.state = "fail";
|
||
|
} else {
|
||
|
suite.result.state = "pass";
|
||
|
}
|
||
|
}
|
||
|
updateTask(suite);
|
||
|
}
|
||
|
function createBenchmarkResult(name) {
|
||
|
return {
|
||
|
name,
|
||
|
rank: 0,
|
||
|
rme: 0,
|
||
|
samples: []
|
||
|
};
|
||
|
}
|
||
|
async function runBenchmarkSuite(suite) {
|
||
|
const { Task, Bench } = await importTinybench();
|
||
|
const start = performance.now();
|
||
|
const benchmarkGroup = [];
|
||
|
const benchmarkSuiteGroup = [];
|
||
|
for (const task of suite.tasks) {
|
||
|
if (task.mode !== "run")
|
||
|
continue;
|
||
|
if (task.type === "benchmark")
|
||
|
benchmarkGroup.push(task);
|
||
|
else if (task.type === "suite")
|
||
|
benchmarkSuiteGroup.push(task);
|
||
|
}
|
||
|
if (benchmarkSuiteGroup.length)
|
||
|
await Promise.all(benchmarkSuiteGroup.map((subSuite) => runBenchmarkSuite(subSuite)));
|
||
|
if (benchmarkGroup.length) {
|
||
|
const defer = createDefer();
|
||
|
const benchmarkMap = {};
|
||
|
suite.result = {
|
||
|
state: "run",
|
||
|
startTime: start,
|
||
|
benchmark: createBenchmarkResult(suite.name)
|
||
|
};
|
||
|
updateTask(suite);
|
||
|
benchmarkGroup.forEach((benchmark, idx) => {
|
||
|
const options = getBenchOptions(benchmark);
|
||
|
const benchmarkInstance = new Bench(options);
|
||
|
const benchmarkFn = getFn(benchmark);
|
||
|
benchmark.result = {
|
||
|
state: "run",
|
||
|
startTime: start,
|
||
|
benchmark: createBenchmarkResult(benchmark.name)
|
||
|
};
|
||
|
const id = idx.toString();
|
||
|
benchmarkMap[id] = benchmark;
|
||
|
const task = new Task(benchmarkInstance, id, benchmarkFn);
|
||
|
benchmark.task = task;
|
||
|
updateTask(benchmark);
|
||
|
});
|
||
|
benchmarkGroup.forEach((benchmark) => {
|
||
|
benchmark.task.addEventListener("complete", (e) => {
|
||
|
const task = e.task;
|
||
|
const _benchmark = benchmarkMap[task.name || ""];
|
||
|
if (_benchmark) {
|
||
|
const taskRes = task.result;
|
||
|
const result = _benchmark.result.benchmark;
|
||
|
Object.assign(result, taskRes);
|
||
|
updateTask(_benchmark);
|
||
|
}
|
||
|
});
|
||
|
benchmark.task.addEventListener("error", (e) => {
|
||
|
const task = e.task;
|
||
|
const _benchmark = benchmarkMap[task.name || ""];
|
||
|
defer.reject(_benchmark ? task.result.error : e);
|
||
|
});
|
||
|
});
|
||
|
Promise.all(benchmarkGroup.map(async (benchmark) => {
|
||
|
await benchmark.task.warmup();
|
||
|
return await new Promise((resolve) => safeSetTimeout(async () => {
|
||
|
resolve(await benchmark.task.run());
|
||
|
}));
|
||
|
})).then((tasks) => {
|
||
|
suite.result.duration = performance.now() - start;
|
||
|
suite.result.state = "pass";
|
||
|
tasks.sort((a, b) => a.result.mean - b.result.mean).forEach((cycle, idx) => {
|
||
|
const benchmark = benchmarkMap[cycle.name || ""];
|
||
|
benchmark.result.state = "pass";
|
||
|
if (benchmark) {
|
||
|
const result = benchmark.result.benchmark;
|
||
|
result.rank = Number(idx) + 1;
|
||
|
updateTask(benchmark);
|
||
|
}
|
||
|
});
|
||
|
updateTask(suite);
|
||
|
defer.resolve(null);
|
||
|
});
|
||
|
await defer;
|
||
|
}
|
||
|
}
|
||
|
async function runSuiteChild(c) {
|
||
|
if (c.type === "test")
|
||
|
return runTest(c);
|
||
|
else if (c.type === "suite")
|
||
|
return runSuite(c);
|
||
|
}
|
||
|
async function runSuites(suites) {
|
||
|
for (const suite of suites)
|
||
|
await runSuite(suite);
|
||
|
}
|
||
|
async function runFiles(files, config) {
|
||
|
var _a, _b;
|
||
|
for (const file of files) {
|
||
|
if (!file.tasks.length && !config.passWithNoTests) {
|
||
|
if (!((_b = (_a = file.result) == null ? void 0 : _a.errors) == null ? void 0 : _b.length)) {
|
||
|
const error = processError(new Error(`No test suite found in file ${file.filepath}`));
|
||
|
file.result = {
|
||
|
state: "fail",
|
||
|
error,
|
||
|
errors: [error]
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
await runSuite(file);
|
||
|
}
|
||
|
}
|
||
|
async function startTestsBrowser(paths, config) {
|
||
|
if (isNode) {
|
||
|
rpc().onPathsCollected(paths);
|
||
|
} else {
|
||
|
const files = await collectTests(paths, config);
|
||
|
await rpc().onCollected(files);
|
||
|
await runSuites(files);
|
||
|
await sendTasksUpdate();
|
||
|
}
|
||
|
}
|
||
|
async function startTestsNode(paths, config) {
|
||
|
const files = await collectTests(paths, config);
|
||
|
rpc().onCollected(files);
|
||
|
const { getSnapshotClient: getSnapshotClient2 } = await import('./chunk-runtime-chain.6df5a66b.js').then(function (n) { return n.u; });
|
||
|
getSnapshotClient2().clear();
|
||
|
await runFiles(files, config);
|
||
|
const coverage = await takeCoverageInsideWorker(config.coverage);
|
||
|
rpc().onAfterSuiteRun({ coverage });
|
||
|
await getSnapshotClient2().saveCurrent();
|
||
|
await sendTasksUpdate();
|
||
|
}
|
||
|
async function startTests(paths, config) {
|
||
|
if (config.browser)
|
||
|
return startTestsBrowser(paths, config);
|
||
|
else
|
||
|
return startTestsNode(paths, config);
|
||
|
}
|
||
|
function clearModuleMocks() {
|
||
|
const { clearMocks, mockReset, restoreMocks, unstubEnvs, unstubGlobals } = getWorkerState().config;
|
||
|
if (restoreMocks)
|
||
|
vi.restoreAllMocks();
|
||
|
else if (mockReset)
|
||
|
vi.resetAllMocks();
|
||
|
else if (clearMocks)
|
||
|
vi.clearAllMocks();
|
||
|
if (unstubEnvs)
|
||
|
vi.unstubAllEnvs();
|
||
|
if (unstubGlobals)
|
||
|
vi.unstubAllGlobals();
|
||
|
}
|
||
|
|
||
|
export { setupGlobalEnv as a, startTests as s, withEnv as w };
|