Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/tests/smoke/run/run-script.test.ts
12925 views
1
import { basename, join } from "../../../src/deno_ral/path.ts";
2
import { ensureDirSync } from "../../../src/deno_ral/fs.ts";
3
import { assert, assertEquals } from "testing/asserts";
4
import { execProcess } from "../../../src/core/process.ts";
5
import { quartoDevCmd } from "../../utils.ts";
6
import { unitTest } from "../../test.ts";
7
import { EOL } from "fs/eol";
8
import { lines } from "../../../src/core/text.ts";
9
10
const workingDir = Deno.makeTempDirSync();
11
12
ensureDirSync(workingDir);
13
14
const ensureStreams = (name: string, script: string, stdout: string, stderr: string) => {
15
unitTest(name, async () => {
16
const result = await execProcess({
17
cmd: quartoDevCmd(),
18
args: [
19
"run",
20
basename(script),
21
],
22
// disable logging here to allow for checking the output
23
env: {
24
"QUARTO_LOG_LEVEL": "CRITICAL",
25
}
26
},
27
undefined,
28
undefined,
29
undefined,
30
true
31
);
32
assert(result.success);
33
assertEquals((result.stdout ?? "").replaceAll("\r", ""), stdout);
34
assertEquals((result.stderr ?? "").replaceAll("\r", ""), stderr);
35
},
36
{
37
teardown: () => {
38
try {
39
Deno.removeSync(basename(script));
40
} catch (_e) {
41
// ignore
42
}
43
return Promise.resolve();
44
},
45
cwd: () => {
46
return workingDir;
47
}
48
})
49
}
50
51
const testRunCmd = (name: string, script: string) => {
52
unitTest(name, async () => {
53
const result = await execProcess({
54
cmd: quartoDevCmd(),
55
args: [
56
"run",
57
basename(script),
58
]
59
});
60
assert(result.success);
61
},
62
{
63
teardown: () => {
64
try {
65
Deno.removeSync(basename(script));
66
} catch (_e) {
67
// ignore
68
}
69
return Promise.resolve();
70
},
71
cwd: () => {
72
return workingDir;
73
}
74
});
75
}
76
77
// Run Lua Script
78
const luaScript = join(workingDir, "test.lua");
79
Deno.writeTextFileSync(luaScript, "print('Hello, world!')");
80
testRunCmd("run-lua-script", luaScript);
81
82
// Run ts script
83
const tsScript = join(workingDir, "test.ts");
84
Deno.writeTextFileSync(tsScript, "console.log('Hello, world!')");
85
testRunCmd("run-ts-script", tsScript);
86
87
// Run Python script
88
const pyScript = join(workingDir, "test.py");
89
Deno.writeTextFileSync(pyScript, "print('Hello, world!')");
90
testRunCmd("run-py-script", pyScript);
91
92
// Run R script
93
const rScript = join(workingDir, "test.R");
94
Deno.writeTextFileSync(rScript, "print('Hello, world!')");
95
testRunCmd("run-r-script", rScript);
96
97
// check stream outputs
98
99
// in R
100
const rScript2 = join(workingDir, "test2.R");
101
Deno.writeTextFileSync(rScript2, "cat('write stdout\\n', file = stdout()); cat('write stderr\\n', file = stderr())");
102
ensureStreams("run-r-script-stdout-stderr", rScript2, "write stdout\n", "write stderr\n");
103
104
// in Python
105
const pyScript2 = join(workingDir, "test2.py");
106
Deno.writeTextFileSync(pyScript2, "import sys; print('write stdout'); print('write stderr', file = sys.stderr)");
107
ensureStreams("run-py-script-stdout-stderr", pyScript2, "write stdout\n", "write stderr\n");
108
109
// in Deno TS
110
const tsScript2 = join(workingDir, "test2.ts");
111
Deno.writeTextFileSync(tsScript2, "console.log('write stdout'); console.error('write stderr')");
112
ensureStreams("run-ts-script-stdout-stderr", tsScript2, "write stdout\n", "write stderr\n");
113
114
// in Lua
115
const luaScript2 = join(workingDir, "test2.lua");
116
Deno.writeTextFileSync(luaScript2, "print('write stdout'); io.stderr:write('write stderr\\n')");
117
ensureStreams("run-lua-script-stdout-stderr", luaScript2, "write stdout\n\n", "write stderr\n"); // don't know why there is an extra newline
118