File tree Expand file tree Collapse file tree 4 files changed +64
-1
lines changed
packages/npm-packages/ruby-wasm-wasi Expand file tree Collapse file tree 4 files changed +64
-1
lines changed Original file line number Diff line number Diff line change 1
1
require_relative "./unit/test_js"
2
2
require_relative "./unit/test_object"
3
3
require_relative "./unit/test_error"
4
+ require_relative "./unit/test_async"
Original file line number Diff line number Diff line change
1
+ require "test-unit"
2
+ require "js"
3
+
4
+ class JS ::TestAsync < Test ::Unit ::TestCase
5
+ def test_await_promise_resolve
6
+ promise = JS . eval ( "return Promise.resolve(42)" )
7
+ assert_equal 42 , promise . await . to_i
8
+ end
9
+
10
+ def test_await_promise_reject
11
+ promise = JS . eval ( "return Promise.reject(42)" )
12
+ e = assert_raise ( JS ::Error ) { promise . await }
13
+ assert_equal "42" , e . message
14
+ end
15
+
16
+ def test_await_promise_chained
17
+ promise = JS . eval ( "return Promise.resolve(42).then(x => x + 1)" )
18
+ assert_equal 43 , promise . await . to_i
19
+ end
20
+
21
+ # def test_await_non_promise
22
+ # assert_equal 42, JS.eval("return 42").await.to_i
23
+ # end
24
+ end
Original file line number Diff line number Diff line change @@ -191,4 +191,33 @@ eval:11:in \`<main>'`);
191
191
const hash = vm . eval ( `Hash.new` ) ;
192
192
hash . call ( "store" , vm . eval ( `"key1"` ) , vm . wrap ( new Object ( ) ) ) ;
193
193
} ) ;
194
+
195
+ test ( "async eval over microtasks" , async ( ) => {
196
+ const vm = await initRubyVM ( ) ;
197
+ const result = await vm . evalAsync ( `
198
+ require 'js'
199
+ o = JS.eval(<<~JS)
200
+ return {
201
+ async_func: () => {
202
+ return new Promise((resolve) => {
203
+ queueMicrotask(() => {
204
+ resolve(42)
205
+ });
206
+ });
207
+ }
208
+ }
209
+ JS
210
+ o.async_func.await
211
+ ` ) ;
212
+ expect ( result . toString ( ) ) . toBe ( "42" ) ;
213
+ } ) ;
214
+
215
+ test ( "async eval multiple times" , async ( ) => {
216
+ const vm = await initRubyVM ( ) ;
217
+ vm . eval ( `require "js"` ) ;
218
+ const ret0 = await vm . evalAsync ( `JS.global[:Promise].resolve(42).await` ) ;
219
+ expect ( ret0 . toString ( ) ) . toBe ( "42" ) ;
220
+ const ret1 = await vm . evalAsync ( `JS.global[:Promise].resolve(43).await` ) ;
221
+ expect ( ret1 . toString ( ) ) . toBe ( "43" ) ;
222
+ } ) ;
194
223
} ) ;
Original file line number Diff line number Diff line change @@ -23,7 +23,11 @@ const instantiate = async (rootTestFile) => {
23
23
const wasi = new WASI({
24
24
stdio: " inherit" ,
25
25
args: [" ruby.wasm" ].concat(process.argv.slice(2)),
26
- env: process.env,
26
+ env: {
27
+ ...process.env,
28
+ // Extend fiber stack size to be able to run test-unit
29
+ " RUBY_FIBER_MACHINE_STACK_SIZE" : String(1024 * 1024 * 20),
30
+ },
27
31
preopens: preopens,
28
32
});
29
33
@@ -47,6 +51,9 @@ const main = async () => {
47
51
const rootTestFile = " /__root__/test/test_unit.rb" ;
48
52
const { vm } = await instantiate(rootTestFile);
49
53
54
+ Error.stackTraceLimit = Infinity;
55
+
56
+ // FIXME: require ' test/unit' fails with evalAsync due to Kernel#eval (? )
50
57
vm.eval(`
51
58
# HACK: Until we've fixed the issue in the test-unit or power_assert
52
59
# See https://github.com/test-unit/test-unit/pull/221
@@ -62,6 +69,8 @@ const main = async () => {
62
69
end
63
70
64
71
require ' test/unit'
72
+ ` );
73
+ await vm.evalAsync(`
65
74
require_relative ' ${rootTestFile}'
66
75
Test::Unit::AutoRunner.run
67
76
` );
You can’t perform that action at this time.
0 commit comments