Skip to content

Commit e9d72c9

Browse files
feat(tests): replace mocha with vitest
1 parent f0a2937 commit e9d72c9

File tree

206 files changed

+2056
-1689
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

206 files changed

+2056
-1689
lines changed

package-lock.json

Lines changed: 1464 additions & 1191 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
"devDependencies": {
1818
"@bytecodealliance/preview2-shim": "^0.17.1",
1919
"cross-env": "^7.0.3",
20-
"mocha": "^11.1.0",
21-
"semver": "^7.7.2"
20+
"semver": "^7.7.2",
21+
"vitest": "^3.2.4"
2222
},
2323
"dependencies": {
2424
"@bytecodealliance/jco": "^1.9.1",
@@ -35,10 +35,9 @@
3535
"build:release": "make release",
3636
"build:weval": "make release-weval",
3737
"build:debug": "make debug",
38-
"test": "mocha -u tdd test/test.js --timeout 120000",
39-
"test:release": "mocha -u tdd test/test.js --timeout 120000",
40-
"test:weval": "cross-env WEVAL_TEST=1 mocha -u tdd test/test.js --timeout 120000",
41-
"test:debug": "cross-env DEBUG_TEST=1 mocha -u tdd test/test.js --timeout 120000",
38+
"test": "vitest run -c test/vitest.ts",
39+
"test:weval": "cross-env WEVAL_TEST=1 vitest run -c test/vitest.ts",
40+
"test:debug": "cross-env DEBUG_TEST=1 vitest run -c test/vitest.ts",
4241
"prepack": "node scripts/prepack.mjs"
4342
},
4443
"files": [

test/bindings.js

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import { fileURLToPath, URL } from 'node:url';
2+
import { readFile, readdir, mkdir, writeFile } from 'node:fs/promises';
3+
4+
import { componentize } from '@bytecodealliance/componentize-js';
5+
import { transpile } from '@bytecodealliance/jco';
6+
7+
import { suite, test } from 'vitest';
8+
9+
import {
10+
DEBUG_TRACING_ENABLED,
11+
LOG_DEBUGGING_ENABLED,
12+
WEVAL_TEST_ENABLED,
13+
DEBUG_TEST_ENABLED,
14+
maybeLogging,
15+
} from './util.js';
16+
17+
suite('Bindings', async () => {
18+
const bindingsCases = await readdir(new URL('./fixtures/cases', import.meta.url));
19+
20+
for (const name of bindingsCases) {
21+
test.concurrent(name, async () => {
22+
const source = await readFile(
23+
new URL(`./fixtures/cases/${name}/source.js`, import.meta.url),
24+
'utf8',
25+
);
26+
27+
const test = await import(`./fixtures/cases/${name}/test.js`);
28+
29+
// Determine the relevant WIT world to use
30+
let witWorld,
31+
witPath,
32+
worldName,
33+
isWasiTarget = false;
34+
if (test.worldName) {
35+
witPath = fileURLToPath(new URL('./wit', import.meta.url));
36+
worldName = test.worldName;
37+
isWasiTarget = true;
38+
} else {
39+
try {
40+
witWorld = await readFile(
41+
new URL(`./fixtures/cases/${name}/world.wit`, import.meta.url),
42+
'utf8',
43+
);
44+
} catch (e) {
45+
if (e?.code == 'ENOENT') {
46+
try {
47+
isWasiTarget = true;
48+
witPath = fileURLToPath(
49+
new URL(`./fixtures/cases/${name}/wit`, import.meta.url),
50+
);
51+
await readdir(witPath);
52+
} catch (e) {
53+
if (e?.code === 'ENOENT') {
54+
witPath = fileURLToPath(new URL('./wit', import.meta.url));
55+
worldName = 'test2';
56+
} else {
57+
throw e;
58+
}
59+
}
60+
} else {
61+
throw e;
62+
}
63+
}
64+
}
65+
66+
const enableFeatures = test.enableFeatures || ['http'];
67+
const disableFeatures =
68+
test.disableFeatures ||
69+
(isWasiTarget ? [] : ['random', 'clocks', 'http', 'stdio']);
70+
71+
let testArg;
72+
try {
73+
const { component, imports } = await componentize(source, {
74+
sourceName: `${name}.js`,
75+
witWorld,
76+
witPath,
77+
worldName,
78+
enableFeatures,
79+
disableFeatures: maybeLogging(disableFeatures),
80+
enableAot: WEVAL_TEST_ENABLED,
81+
debugBuild: DEBUG_TEST_ENABLED,
82+
});
83+
const map = {
84+
'wasi:cli-base/*': '@bytecodealliance/preview2-shim/cli-base#*',
85+
'wasi:clocks/*': '@bytecodealliance/preview2-shim/clocks#*',
86+
'wasi:filesystem/*': '@bytecodealliance/preview2-shim/filesystem#*',
87+
'wasi:http/*': '@bytecodealliance/preview2-shim/http#*',
88+
'wasi:io/*': '@bytecodealliance/preview2-shim/io#*',
89+
'wasi:logging/*': '@bytecodealliance/preview2-shim/logging#*',
90+
'wasi:poll/*': '@bytecodealliance/preview2-shim/poll#*',
91+
'wasi:random/*': '@bytecodealliance/preview2-shim/random#*',
92+
'wasi:sockets/*': '@bytecodealliance/preview2-shim/sockets#*',
93+
};
94+
for (let [impt] of imports) {
95+
if (impt.startsWith('wasi:')) continue;
96+
if (impt.startsWith('[')) impt = impt.slice(impt.indexOf(']') + 1);
97+
let importName = impt.split('/').pop();
98+
if (importName === 'test') importName = 'imports';
99+
map[impt] = `../../fixtures/cases/${name}/${importName}.js`;
100+
}
101+
102+
const {
103+
files,
104+
imports: componentImports,
105+
exports: componentExports,
106+
} = await transpile(component, {
107+
name,
108+
map,
109+
wasiShim: true,
110+
validLiftingOptimization: false,
111+
tracing: DEBUG_TRACING_ENABLED,
112+
});
113+
114+
testArg = { imports, componentImports, componentExports };
115+
116+
await mkdir(new URL(`./output/${name}/interfaces`, import.meta.url), {
117+
recursive: true,
118+
});
119+
120+
await writeFile(
121+
new URL(`./output/${name}.component.wasm`, import.meta.url),
122+
component,
123+
);
124+
125+
for (const file of Object.keys(files)) {
126+
let source = files[file];
127+
await writeFile(
128+
new URL(`./output/${name}/${file}`, import.meta.url),
129+
source,
130+
);
131+
}
132+
133+
var instance = await import(`./output/${name}/${name}.js`);
134+
} catch (e) {
135+
if (test.err) {
136+
test.err(e);
137+
return;
138+
}
139+
throw e;
140+
}
141+
await test.test(instance, testArg);
142+
});
143+
}
144+
});

test/builtins.js

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import { readFile, readdir, mkdir, writeFile } from 'node:fs/promises';
2+
import { spawn } from 'node:child_process';
3+
import { fileURLToPath, URL } from 'node:url';
4+
5+
import { componentize } from '@bytecodealliance/componentize-js';
6+
import { transpile } from '@bytecodealliance/jco';
7+
8+
import { suite, test, assert } from 'vitest';
9+
10+
import {
11+
DEBUG_TRACING_ENABLED,
12+
LOG_DEBUGGING_ENABLED,
13+
WEVAL_TEST_ENABLED,
14+
DEBUG_TEST_ENABLED,
15+
maybeLogging,
16+
} from './util.js';
17+
18+
suite('Builtins', async () => {
19+
const builtins = await readdir(
20+
new URL('./fixtures/builtins', import.meta.url),
21+
);
22+
23+
for (const filename of builtins) {
24+
const name = filename.slice(0, -3);
25+
test.concurrent(name, async () => {
26+
const {
27+
source,
28+
test: runTest,
29+
disableFeatures,
30+
enableFeatures,
31+
} = await import(`./fixtures/builtins/${name}.js`);
32+
33+
const { component } = await componentize(
34+
source,
35+
`
36+
package local:runworld;
37+
world runworld {
38+
export run: func();
39+
}
40+
`,
41+
{
42+
sourceName: `${name}.js`,
43+
// also test the debug build while we are about it (unless testing Weval)
44+
debugBuild: DEBUG_TEST_ENABLED,
45+
enableFeatures,
46+
disableFeatures: maybeLogging(disableFeatures),
47+
enableAot: WEVAL_TEST_ENABLED,
48+
},
49+
);
50+
51+
const { files } = await transpile(component, {
52+
name,
53+
wasiShim: true,
54+
tracing: DEBUG_TRACING_ENABLED,
55+
});
56+
57+
await mkdir(new URL(`./output/${name}/interfaces`, import.meta.url), {
58+
recursive: true,
59+
});
60+
61+
await writeFile(
62+
new URL(`./output/${name}.component.wasm`, import.meta.url),
63+
component,
64+
);
65+
66+
for (const file of Object.keys(files)) {
67+
await writeFile(
68+
new URL(`./output/${name}/${file}`, import.meta.url),
69+
files[file],
70+
);
71+
}
72+
73+
await writeFile(
74+
new URL(`./output/${name}/run.js`, import.meta.url),
75+
`
76+
import { run } from './${name}.js';
77+
run();
78+
`,
79+
);
80+
81+
try {
82+
await runTest(async function run() {
83+
let stdout = '',
84+
stderr = '',
85+
timeout;
86+
try {
87+
await new Promise((resolve, reject) => {
88+
const cp = spawn(
89+
process.argv[0],
90+
[
91+
fileURLToPath(
92+
new URL(`./output/${name}/run.js`, import.meta.url),
93+
),
94+
],
95+
{ stdio: 'pipe' },
96+
);
97+
cp.stdout.on('data', (chunk) => {
98+
stdout += chunk;
99+
});
100+
cp.stderr.on('data', (chunk) => {
101+
stderr += chunk;
102+
});
103+
cp.on('error', reject);
104+
cp.on('exit', (code) =>
105+
code === 0 ? resolve() : reject(new Error(stderr || stdout)),
106+
);
107+
timeout = setTimeout(() => {
108+
reject(
109+
new Error(
110+
'test timed out with output:\n' +
111+
stdout +
112+
'\n\nstderr:\n' +
113+
stderr,
114+
),
115+
);
116+
}, 10_000);
117+
});
118+
} catch (err) {
119+
throw { err, stdout, stderr };
120+
} finally {
121+
clearTimeout(timeout);
122+
}
123+
124+
return { stdout, stderr };
125+
});
126+
} catch (err) {
127+
if (err.stderr) console.error(err.stderr);
128+
throw err.err || err;
129+
}
130+
});
131+
}
132+
});

test/builtins/math-random-disabled.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

test/cases/args/test.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/cases/bad-binding/test.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/cases/char/test.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

test/cases/conventions/test.js

Lines changed: 0 additions & 11 deletions
This file was deleted.

test/cases/empty/test.js

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)