cynic
Version:
async testing framework for es-modules
65 lines (61 loc) • 1.23 kB
text/typescript
import {Suite} from "../../types.js"
import {objectMapAsync} from "../toolbox/object-map-async.js"
import {Results} from "./execution-types.js"
import {
s_pass,
s_error,
s_counts,
} from "./symbols.js"
export async function execute(suite: Suite): Promise<Results> {
if (typeof suite === "boolean") {
return {
[]: suite,
[]: null,
[]: true,
}
}
else if (typeof suite === "function") {
try {
const result = await suite()
if (typeof result === "boolean") {
return {
[]: result,
[]: null,
[]: true,
}
}
else if (result && typeof result === "object") {
return await execute(result)
}
else {
return {
[]: true,
[]: null,
[]: true,
}
}
}
catch (err) {
return {
[]: false,
[]: err,
[]: true,
}
}
}
else if (typeof suite === "object") {
let all = true
const results = await objectMapAsync(suite, async value => {
const r = await execute(value)
if (!r[s_pass]) all = false
return r
})
return {
...results,
[]: all,
[]: null,
[]: false,
}
}
else throw new Error("invalid suite item")
}