deno/cli/js/unit_test_runner.ts

104 lines
2.3 KiB
TypeScript
Executable File

#!/usr/bin/env -S deno run --reload --allow-run
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import "./unit_tests.ts";
import {
permissionCombinations,
parseUnitTestOutput,
Permissions
} from "./test_util.ts";
interface TestResult {
perms: string;
output: string;
result: number;
}
function permsToCliFlags(perms: Permissions): string[] {
return Object.keys(perms)
.map((key): string => {
if (!perms[key]) return "";
const cliFlag = key.replace(
/\.?([A-Z])/g,
(x, y): string => `-${y.toLowerCase()}`
);
return `--allow-${cliFlag}`;
})
.filter((e): boolean => e.length > 0);
}
function fmtPerms(perms: Permissions): string {
let fmt = permsToCliFlags(perms).join(" ");
if (!fmt) {
fmt = "<no permissions>";
}
return fmt;
}
async function main(): Promise<void> {
console.log(
"Discovered permission combinations for tests:",
permissionCombinations.size
);
for (const perms of permissionCombinations.values()) {
console.log("\t" + fmtPerms(perms));
}
const testResults = new Set<TestResult>();
for (const perms of permissionCombinations.values()) {
const permsFmt = fmtPerms(perms);
console.log(`Running tests for: ${permsFmt}`);
const cliPerms = permsToCliFlags(perms);
// run subsequent tests using same deno executable
const args = [Deno.execPath(), "run", ...cliPerms, "cli/js/unit_tests.ts"];
const p = Deno.run({
args,
stdout: "piped"
});
const { actual, expected, resultOutput } = parseUnitTestOutput(
await p.output(),
true
);
let result = 0;
if (!actual && !expected) {
console.error("Bad cli/js/unit_test.ts output");
result = 1;
} else if (expected !== actual) {
result = 1;
}
testResults.add({
perms: permsFmt,
output: resultOutput,
result
});
}
// if any run tests returned non-zero status then whole test
// run should fail
let testsFailed = false;
for (const testResult of testResults) {
console.log(`Summary for ${testResult.perms}`);
console.log(testResult.output + "\n");
testsFailed = testsFailed || Boolean(testResult.result);
}
if (testsFailed) {
console.error("Unit tests failed");
Deno.exit(1);
}
console.log("Unit tests passed");
}
main();