@@ -11,6 +11,8 @@ const LOG_DEBUGGING = false;
11
11
const enableAot = process . env . WEVAL_TEST == '1' ;
12
12
const debugBuild = process . env . DEBUG_TEST == '1' ;
13
13
14
+ const noOp = async ( ) => { } ;
15
+
14
16
function maybeLogging ( disableFeatures ) {
15
17
if ( ! LOG_DEBUGGING ) return disableFeatures ;
16
18
if ( disableFeatures && disableFeatures . includes ( 'stdio' ) ) {
@@ -25,12 +27,23 @@ suite('Builtins', () => {
25
27
const name = filename . slice ( 0 , - 3 ) ;
26
28
test ( name , async ( ) => {
27
29
const {
30
+ state,
28
31
source,
29
32
test : runTest ,
30
33
disableFeatures,
31
34
enableFeatures,
32
35
} = await import ( `./builtins/${ filename } ` ) ;
33
36
37
+ // If an args object was provided, generate the arguments to feed to both
38
+ // source generation (if necessary) and the test run itself
39
+ let stateFn = state ?? noOp ;
40
+ const stateObj = await stateFn ( ) ;
41
+
42
+ // If the source is a function then invoke it to generate the source string, possibly with arguments
43
+ if ( typeof source === 'function' ) {
44
+ source ( stateObj ) ;
45
+ }
46
+
34
47
const { component } = await componentize (
35
48
source ,
36
49
`
@@ -46,7 +59,7 @@ suite('Builtins', () => {
46
59
enableFeatures,
47
60
disableFeatures : maybeLogging ( disableFeatures ) ,
48
61
enableAot,
49
- }
62
+ } ,
50
63
) ;
51
64
52
65
const { files } = await transpile ( component , {
@@ -61,13 +74,13 @@ suite('Builtins', () => {
61
74
62
75
await writeFile (
63
76
new URL ( `./output/${ name } .component.wasm` , import . meta. url ) ,
64
- component
77
+ component ,
65
78
) ;
66
79
67
80
for ( const file of Object . keys ( files ) ) {
68
81
await writeFile (
69
82
new URL ( `./output/${ name } /${ file } ` , import . meta. url ) ,
70
- files [ file ]
83
+ files [ file ] ,
71
84
) ;
72
85
}
73
86
@@ -76,11 +89,12 @@ suite('Builtins', () => {
76
89
`
77
90
import { run } from './${ name } .js';
78
91
run();
79
- `
92
+ ` ,
80
93
) ;
81
94
82
95
try {
83
- await runTest ( async function run ( ) {
96
+ // Build a run function to pass to the test
97
+ const runFn = async function run ( ) {
84
98
let stdout = '' ,
85
99
stderr = '' ,
86
100
timeout ;
@@ -90,10 +104,10 @@ suite('Builtins', () => {
90
104
process . argv [ 0 ] ,
91
105
[
92
106
fileURLToPath (
93
- new URL ( `./output/${ name } /run.js` , import . meta. url )
107
+ new URL ( `./output/${ name } /run.js` , import . meta. url ) ,
94
108
) ,
95
109
] ,
96
- { stdio : 'pipe' }
110
+ { stdio : 'pipe' } ,
97
111
) ;
98
112
cp . stdout . on ( 'data' , ( chunk ) => {
99
113
stdout += chunk ;
@@ -103,16 +117,16 @@ suite('Builtins', () => {
103
117
} ) ;
104
118
cp . on ( 'error' , reject ) ;
105
119
cp . on ( 'exit' , ( code ) =>
106
- code === 0 ? resolve ( ) : reject ( new Error ( stderr || stdout ) )
120
+ code === 0 ? resolve ( ) : reject ( new Error ( stderr || stdout ) ) ,
107
121
) ;
108
122
timeout = setTimeout ( ( ) => {
109
123
reject (
110
124
new Error (
111
125
'test timed out with output:\n' +
112
126
stdout +
113
127
'\n\nstderr:\n' +
114
- stderr
115
- )
128
+ stderr ,
129
+ ) ,
116
130
) ;
117
131
} , 10_000 ) ;
118
132
} ) ;
@@ -123,7 +137,10 @@ suite('Builtins', () => {
123
137
}
124
138
125
139
return { stdout, stderr } ;
126
- } ) ;
140
+ } ;
141
+
142
+ // Run the actual test
143
+ await runTest ( runFn , stateObj ) ;
127
144
} catch ( err ) {
128
145
if ( err . stderr ) console . error ( err . stderr ) ;
129
146
throw err . err || err ;
@@ -138,7 +155,7 @@ suite('Bindings', () => {
138
155
test ( name , async ( ) => {
139
156
const source = await readFile (
140
157
new URL ( `./cases/${ name } /source.js` , import . meta. url ) ,
141
- 'utf8'
158
+ 'utf8' ,
142
159
) ;
143
160
144
161
let witWorld ,
@@ -148,14 +165,14 @@ suite('Bindings', () => {
148
165
try {
149
166
witWorld = await readFile (
150
167
new URL ( `./cases/${ name } /world.wit` , import . meta. url ) ,
151
- 'utf8'
168
+ 'utf8' ,
152
169
) ;
153
170
} catch ( e ) {
154
171
if ( e ?. code == 'ENOENT' ) {
155
172
try {
156
173
isWasiTarget = true ;
157
174
witPath = fileURLToPath (
158
- new URL ( `./cases/${ name } /wit` , import . meta. url )
175
+ new URL ( `./cases/${ name } /wit` , import . meta. url ) ,
159
176
) ;
160
177
await readdir ( witPath ) ;
161
178
} catch ( e ) {
@@ -229,14 +246,14 @@ suite('Bindings', () => {
229
246
230
247
await writeFile (
231
248
new URL ( `./output/${ name } .component.wasm` , import . meta. url ) ,
232
- component
249
+ component ,
233
250
) ;
234
251
235
252
for ( const file of Object . keys ( files ) ) {
236
253
let source = files [ file ] ;
237
254
await writeFile (
238
255
new URL ( `./output/${ name } /${ file } ` , import . meta. url ) ,
239
- source
256
+ source ,
240
257
) ;
241
258
}
242
259
@@ -274,12 +291,12 @@ suite('WASI', () => {
274
291
worldName : 'test1' ,
275
292
enableAot,
276
293
debugBuild,
277
- }
294
+ } ,
278
295
) ;
279
296
280
297
await writeFile (
281
298
new URL ( `./output/wasi.component.wasm` , import . meta. url ) ,
282
- component
299
+ component ,
283
300
) ;
284
301
285
302
const { files } = await transpile ( component , { tracing : DEBUG_TRACING } ) ;
@@ -291,7 +308,7 @@ suite('WASI', () => {
291
308
for ( const file of Object . keys ( files ) ) {
292
309
await writeFile (
293
310
new URL ( `./output/wasi/${ file } ` , import . meta. url ) ,
294
- files [ file ]
311
+ files [ file ] ,
295
312
) ;
296
313
}
297
314
0 commit comments