68 lines
1.5 KiB
JavaScript
68 lines
1.5 KiB
JavaScript
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 * from './reporter/index.js'
|
|
export { runifmain } from './runifmain.js'
|
|
export { suite } from './suite.js'
|
|
export { metaltest }
|
|
export default metaltest |