107 lines
2.8 KiB
JavaScript
107 lines
2.8 KiB
JavaScript
|
// This script performs QA checks.
|
||
|
|
||
|
import { runTestCase } from "./lib/runner.mjs"
|
||
|
import { testCases as webTestCases } from "./lib/web.mjs"
|
||
|
|
||
|
// testCases lists all the test cases.
|
||
|
//
|
||
|
// A test case is an object with the structure described
|
||
|
// by the documentation of runTestCase in ./lib/runner.mjs.
|
||
|
const testCases = [
|
||
|
...webTestCases,
|
||
|
]
|
||
|
|
||
|
// checkForDuplicateTestCases ensures there are no duplicate names.
|
||
|
function checkForDuplicateTestCases() {
|
||
|
let dups = {}
|
||
|
for (let i = 0; i < testCases.length; i++) {
|
||
|
const testCase = testCases[i]
|
||
|
if (dups[testCase.name] !== undefined) {
|
||
|
console.log(`fatal: duplicate test case name: ${testCase.name}`)
|
||
|
process.exit(1)
|
||
|
}
|
||
|
dups[testCase.name] = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// runAllTestCases runs all the available test cases.
|
||
|
function runAllTestCases() {
|
||
|
let result = true
|
||
|
for (let i = 0; i < testCases.length; i++) {
|
||
|
result = result && runTestCase(testCases[i])
|
||
|
}
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
// makeTestCasesMap creates a map from the test case name
|
||
|
// to the test case definition.
|
||
|
function makeTestCasesMap() {
|
||
|
var map = {}
|
||
|
for (let i = 0; i < testCases.length; i++) {
|
||
|
const testCase = testCases[i]
|
||
|
map[testCase.name] = testCase
|
||
|
}
|
||
|
return map
|
||
|
}
|
||
|
|
||
|
// commandRun implements the run command.
|
||
|
function commandRun(args) {
|
||
|
const bailOnFailure = (result) => {
|
||
|
if (!result) {
|
||
|
console.log("some checks failed (see above logs)")
|
||
|
process.exit(1)
|
||
|
}
|
||
|
}
|
||
|
if (args.length < 1) {
|
||
|
bailOnFailure(runAllTestCases())
|
||
|
return
|
||
|
}
|
||
|
let result = true
|
||
|
const map = makeTestCasesMap()
|
||
|
for (let i = 0; i < args.length; i++) {
|
||
|
const arg = args[i]
|
||
|
const testCase = map[arg]
|
||
|
if (testCase === undefined) {
|
||
|
console.log(`unknown test case: ${arg}`)
|
||
|
process.exit(1)
|
||
|
}
|
||
|
result = result && runTestCase(testCase)
|
||
|
}
|
||
|
bailOnFailure(result)
|
||
|
}
|
||
|
|
||
|
// commandList implements the list command.
|
||
|
function commandList() {
|
||
|
for (let i = 0; i < testCases.length; i++) {
|
||
|
const testCase = testCases[i]
|
||
|
console.log(`${testCase.name}: ${testCase.description}`)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// main is the main function.
|
||
|
function main() {
|
||
|
const usageAndExit = (exitcode) => {
|
||
|
console.log("usage: node ./QA/index.mjs list")
|
||
|
console.log("usage: node ./QA/index.mjs run [test_case_name...]")
|
||
|
process.exit(exitcode)
|
||
|
}
|
||
|
if (process.argv.length < 3) {
|
||
|
usageAndExit(0)
|
||
|
}
|
||
|
checkForDuplicateTestCases()
|
||
|
const command = process.argv[2]
|
||
|
switch (command) {
|
||
|
case "list":
|
||
|
commandList()
|
||
|
break
|
||
|
case "run":
|
||
|
commandRun(process.argv.slice(3))
|
||
|
break
|
||
|
default:
|
||
|
console.log(`unknown command: ${command}`)
|
||
|
usageAndExit(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main()
|