Add easy suite testing

master
Frédéric Matte 2022-12-04 16:30:05 -05:00
parent 7a8a4ad629
commit 247bd26c8b
3 changed files with 66 additions and 1 deletions

View File

@ -54,3 +54,18 @@ suite.js
const { test } = await import("test.js"); const { test } = await import("test.js");
await test.run(consolereporter()); await test.run(consolereporter());
``` ```
## Hot to easily run a suite of multiple test
test.js
```js
...
```
suite.js
```js
import { suite } from "metaltest";
await suite(); // Will run all test that are in the current folder recursively
```

View File

@ -3,6 +3,7 @@ import { consolereporter } from './consolereporter.js'
import { linereporter } from './linereporter.js' import { linereporter } from './linereporter.js'
import { totalreporter } from './totalreporter.js' import { totalreporter } from './totalreporter.js'
import { runifmain } from './runifmain.js' import { runifmain } from './runifmain.js'
import { suite } from './suite.js'
const noreporter = { const noreporter = {
start: (title) => { }, start: (title) => { },
@ -67,5 +68,5 @@ const metaltest = (title) => {
return runner return runner
} }
export { metaltest, consolereporter, linereporter, totalreporter, runifmain } export { metaltest, consolereporter, linereporter, totalreporter, runifmain, suite }
export default metaltest export default metaltest

49
suite.js Normal file
View File

@ -0,0 +1,49 @@
import { readdir } from 'node:fs/promises'
import { join } from 'node:path'
const walkDir = async function* (dir) {
const files = await readdir(dir, { withFileTypes: true })
for (const file of files) {
if (file.isDirectory()) {
yield* walkDir(join(dir, file.name))
} else {
yield join(dir, file.name)
}
}
}
import { fileURLToPath } from 'node:url'
import { dirname } from 'node:path'
const getStackAbsolutePaths = () => {
const old = Error.prepareStackTrace
Error.prepareStackTrace = (_, stack) => stack
const stack = new Error().stack
Error.prepareStackTrace = old
return stack
.map(cs => cs.getFileName())
.filter(filename => filename?.startsWith('file://'))
.map(filename => dirname(fileURLToPath(filename)))
}
import { consolereporter, totalreporter } from 'metaltest'
const suite = async (folder = '.') => {
const absolutePaths = getStackAbsolutePaths()
const absolutePath = absolutePaths[2]
const total = totalreporter()
for await (const file of walkDir(folder)) {
if (file.includes('node_modules')) continue
if (file.startsWith('.git')) continue
if (!file.endsWith('test.js')) continue
const module = join(absolutePath, file)
const { test } = await import(module)
await test.run(consolereporter(), total)
}
console.log(total.msg())
}
export { suite }