-
Notifications
You must be signed in to change notification settings - Fork 39
/
get_test_runner_code.ts
116 lines (106 loc) · 3.94 KB
/
get_test_runner_code.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
import { CodeBlockWriter } from "../mod.deps.ts";
import { runTestDefinitions } from "./test_runner.ts";
export function getTestRunnerCode(options: {
testEntryPoints: string[];
denoTestShimPackageName: string | undefined;
includeEsModule: boolean | undefined;
includeScriptModule: boolean | undefined;
}) {
const usesDenoTest = options.denoTestShimPackageName != null;
const writer = createWriter();
writer.writeLine(`const chalk = require("chalk");`)
.writeLine(`const process = require("process");`);
if (usesDenoTest) {
writer.writeLine(`const { pathToFileURL } = require("url");`);
writer.writeLine(
`const { testDefinitions } = require("${options.denoTestShimPackageName}");`,
);
}
writer.blankLine();
writer.writeLine("const filePaths = [");
writer.indent(() => {
for (const entryPoint of options.testEntryPoints) {
writer.quote(entryPoint.replace(/\.ts$/, ".js")).write(",").newLine();
}
});
writer.writeLine("];").newLine();
writer.write("async function main()").block(() => {
if (usesDenoTest) {
writer.write("const testContext = ").inlineBlock(() => {
writer.writeLine("process,");
writer.writeLine("chalk,");
}).write(";").newLine();
}
writer.write("for (const [i, filePath] of filePaths.entries())")
.block(() => {
writer.write("if (i > 0)").block(() => {
writer.writeLine(`console.log("");`);
}).blankLine();
if (options.includeScriptModule) {
writer.writeLine(`const scriptPath = "./script/" + filePath;`);
writer.writeLine(
`console.log("Running tests in " + chalk.underline(scriptPath) + "...\\n");`,
);
writer.writeLine(`process.chdir(__dirname + "/script");`);
if (usesDenoTest) {
writer.write(`const scriptTestContext = `).inlineBlock(() => {
writer.writeLine("origin: pathToFileURL(filePath).toString(),");
writer.writeLine("...testContext,");
}).write(";").newLine();
}
writer.write("try ").inlineBlock(() => {
writer.writeLine(`require(scriptPath);`);
}).write(" catch(err)").block(() => {
writer.writeLine("console.error(err);");
writer.writeLine("process.exit(1);");
});
if (usesDenoTest) {
writer.writeLine(
"await runTestDefinitions(testDefinitions.splice(0, testDefinitions.length), scriptTestContext);",
);
}
}
if (options.includeEsModule) {
if (options.includeScriptModule) {
writer.blankLine();
}
writer.writeLine(`const esmPath = "./esm/" + filePath;`);
writer.writeLine(
`console.log("\\nRunning tests in " + chalk.underline(esmPath) + "...\\n");`,
);
writer.writeLine(`process.chdir(__dirname + "/esm");`);
if (usesDenoTest) {
writer.write(`const esmTestContext = `).inlineBlock(() => {
writer.writeLine("origin: pathToFileURL(filePath).toString(),");
writer.writeLine("...testContext,");
}).write(";").newLine();
}
writer.writeLine(`await import(esmPath);`);
if (usesDenoTest) {
writer.writeLine(
"await runTestDefinitions(testDefinitions.splice(0, testDefinitions.length), esmTestContext);",
);
}
}
});
});
writer.blankLine();
if (options.denoTestShimPackageName != null) {
writer.writeLine(`${getRunTestDefinitionsCode()}`);
writer.blankLine();
}
writer.writeLine("main();");
return writer.toString();
}
function getRunTestDefinitionsCode() {
return runTestDefinitions.toString().replace(
"export async function",
"async function",
);
}
function createWriter() {
return new CodeBlockWriter({
indentNumberOfSpaces: 2,
});
}