UNPKG

@plugjs/expect5

Version:

Unit Testing for the PlugJS Build System ========================================

117 lines (116 loc) 3.91 kB
// execution/executor.ts import assert from "node:assert"; import { EventEmitter } from "node:events"; import { Hook, Spec, Suite } from "./executable.mjs"; function runSuite(suite) { const _emitter = new EventEmitter(); let resolve; let reject; const promise = new Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; }); const result = { time: 0, passed: 0, failed: 0, skipped: 0, failures: [], records: [] }; const execution = { result: promise, on: (event, listener) => { _emitter.on(event, listener); return execution; }, off: (event, listener) => { _emitter.off(event, listener); return execution; }, once: (event, listener) => { _emitter.once(event, listener); return execution; } }; const start = (executable) => { const type = executable instanceof Suite ? "suite" : executable instanceof Spec ? "spec" : executable instanceof Hook ? "hook" : ( /* coverage ignore next */ assert.fail(`Unable to start ${Object.getPrototypeOf(executable)?.constructor?.name}`) ); const now = Date.now(); _emitter.emit(`${type}:start`, executable); let done = false; let failure; return { done(skipped = false) { const time = Date.now() - now; done = true; if (type === "suite") { _emitter.emit(`${type}:done`, executable, time); return; } if (failure) { _emitter.emit(`${type}:fail`, executable, time, failure); if (type === "spec") result.failed++; } else if (skipped) { _emitter.emit(`${type}:skip`, executable, time); if (type === "spec") result.skipped++; } else { const slow = time >= executable.timeout * 0.75; _emitter.emit(`${type}:pass`, executable, time, slow); if (type === "spec") result.passed++; } }, notify(error) { const number = result.failures.length + 1; const fail = { error, number, source: executable, type }; result.failures.push(fail); if (failure || done) { _emitter.emit(`${type}:error`, executable, fail); } else { failure = fail; } } }; }; const suiteRecords = [{ type: "suite", name: "", records: [] }]; execution.on("suite:start", (current) => { const record = { type: "suite", name: current.name, records: [] }; suiteRecords[suiteRecords.length - 1].records.push(record); suiteRecords.push(record); }); execution.on("suite:done", () => { if (suiteRecords.length > 1) suiteRecords.pop(); }); execution.on("spec:skip", (spec, ms) => { const record = { type: "spec", name: spec.name, result: "skipped", ms }; suiteRecords[suiteRecords.length - 1].records.push(record); }); execution.on("spec:pass", (spec, ms) => { const record = { type: "spec", name: spec.name, result: "passed", ms }; suiteRecords[suiteRecords.length - 1].records.push(record); if (ms >= spec.timeout * 0.75) record.slow = true; }); execution.on("spec:fail", (spec, ms, { number }) => { const record = { type: "spec", name: spec.name, result: "failed", failure: number, ms }; suiteRecords[suiteRecords.length - 1].records.push(record); }); execution.on("hook:fail", (hook, _, { number }) => { const record = { type: "hook", name: hook.name, result: "failed", failure: number }; suiteRecords[suiteRecords.length - 1].records.push(record); }); setImmediate(() => Promise.resolve().then(async () => { const now = Date.now(); await suite.setup(); await suite.execute({ start }); result.time = Date.now() - now; result.records.push(...suiteRecords[0].records); resolve(result); }).catch((error) => reject(error))); return execution; } export { runSuite }; //# sourceMappingURL=executor.mjs.map