import { nullreporter } from './reporter/nullreporter.js' const metaltest = (title) => { const suite = [] const only = [] const before = [] const after = [] let success = 0 let fail = 0 const testSuccess = [] const testFail = [] const runner = (name, fn) => { suite.push({ name, fn }) } runner.only = (name, fn) => { only.push({ name, fn }) } runner.before = (fn) => { before.push(fn) } runner.after = (fn) => { after.push(fn) } runner.run = async (...reporters) => { const rs = reporters.map(r => Object.assign({}, nullreporter, r)) rs.forEach(r => r.start(title)) rs.forEach(r => r.before()) const tests = only.length ? only : suite for (const test of tests) { try { for (const fn of before) await fn() await test.fn() success++ rs.forEach(r => r.success(test)) } catch (e) { fail++ testFail.push(Object.assign({}, test, { error: e })) rs.forEach(r => r.fail(test, e)) } } for (const fn of after) await fn() rs.forEach(r => r.after()) const stats = { title, success, fail, total: success + fail, testSuccess, testFail } rs.forEach(r => r.end(stats)) return stats } return runner } export * from './reporter/index.js' export { runifmain } from './runifmain.js' export { suite } from './suite.js' export { metaltest } export default metaltest