import { consolereporter } from './consolereporter.js' import { linereporter } from './linereporter.js' import { totalreporter } from './totalreporter.js' import { runifmain } from './runifmain.js' import { suite } from './suite.js' const noreporter = { start: (title) => { }, before: () => { }, success: (test) => { }, fail: (test, e) => { }, after: () => { }, end: (stats) => { }, } 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({}, noreporter, 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 { metaltest, consolereporter, linereporter, totalreporter, runifmain, suite } export default metaltest