@@ -53,7 +53,10 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
5353 " function h() {\n "
5454 " \t return new Promise((resolve) => resolve(34));\n "
5555 " }\n "
56- " module.exports = { f, g, h };\n " ;
56+ " async function i() {\n "
57+ " \t throw Error('Hi there!');\n "
58+ " }\n "
59+ " module.exports = { f, g, h, i };\n " ;
5760
5861 EXPECT_EQ ((int )0 , (int )metacall_load_from_memory (" node" , buffer, sizeof (buffer), NULL ));
5962
@@ -70,29 +73,35 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
7073
7174 /* Test resolve */
7275 void *future = metacall_await (
73- " f" , args, [](void *result, void *data) -> void * {
74- EXPECT_NE ((void *) NULL , (void *) result);
76+ " f" ,
77+ args,
78+ [](void *result, void *data) -> void * {
79+ EXPECT_NE ((void *)NULL , (void *)result);
7580
76- EXPECT_EQ ((enum metacall_value_id) metacall_value_id (result), (enum metacall_value_id) METACALL_DOUBLE);
81+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (result), (enum metacall_value_id)METACALL_DOUBLE);
7782
78- EXPECT_EQ ((double ) 10.0 , (double ) metacall_value_to_double (result));
83+ EXPECT_EQ ((double )10.0 , (double )metacall_value_to_double (result));
7984
80- EXPECT_NE ((void *) NULL , (void *) data);
85+ EXPECT_NE ((void *)NULL , (void *)data);
8186
82- struct async_context * ctx = static_cast <struct async_context *>(data);
87+ struct async_context *ctx = static_cast <struct async_context *>(data);
8388
84- EXPECT_EQ ((int ) 234 , (int ) ctx->value );
89+ EXPECT_EQ ((int )234 , (int )ctx->value );
8590
86- printf (" Resolve C Callback\n " );
91+ printf (" Resolve C Callback\n " );
8792
88- return metacall_value_create_double (15.0 ); }, [](void *, void *) -> void * {
89- int this_should_never_be_executed = 0 ;
93+ return metacall_value_create_double (15.0 );
94+ },
95+ [](void *, void *) -> void * {
96+ int this_should_never_be_executed = 0 ;
9097
91- EXPECT_EQ ((int ) 1 , (int ) this_should_never_be_executed);
98+ EXPECT_EQ ((int )1 , (int )this_should_never_be_executed);
9299
93- printf (" Reject C Callback\n " );
100+ printf (" Reject C Callback\n " );
94101
95- return NULL ; }, static_cast <void *>(&ctx));
102+ return NULL ;
103+ },
104+ static_cast <void *>(&ctx));
96105
97106 EXPECT_NE ((void *)NULL , (void *)future);
98107
@@ -102,31 +111,37 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
102111
103112 /* Test reject */
104113 future = metacall_await (
105- " g" , args, [](void *, void *) -> void * {
106- int this_should_never_be_executed = 0 ;
114+ " g" ,
115+ args,
116+ [](void *, void *) -> void * {
117+ int this_should_never_be_executed = 0 ;
107118
108- EXPECT_EQ ((int ) 1 , (int ) this_should_never_be_executed);
119+ EXPECT_EQ ((int )1 , (int )this_should_never_be_executed);
109120
110- printf (" Resolve C Callback\n " );
121+ printf (" Resolve C Callback\n " );
111122
112- return NULL ; }, [](void *result, void *data) -> void * {
113- EXPECT_NE ((void *) NULL , (void *) result);
123+ return NULL ;
124+ },
125+ [](void *result, void *data) -> void * {
126+ EXPECT_NE ((void *)NULL , (void *)result);
114127
115- EXPECT_EQ ((enum metacall_value_id) metacall_value_id (result), (enum metacall_value_id) METACALL_DOUBLE);
128+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (result), (enum metacall_value_id)METACALL_DOUBLE);
116129
117- EXPECT_EQ ((double ) 10.0 , (double ) metacall_value_to_double (result));
130+ EXPECT_EQ ((double )10.0 , (double )metacall_value_to_double (result));
118131
119- EXPECT_NE ((void *) NULL , (void *) data);
132+ EXPECT_NE ((void *)NULL , (void *)data);
120133
121- struct async_context * ctx = static_cast <struct async_context *>(data);
134+ struct async_context *ctx = static_cast <struct async_context *>(data);
122135
123- EXPECT_EQ ((int ) 234 , (int ) ctx->value );
136+ EXPECT_EQ ((int )234 , (int )ctx->value );
124137
125- printf (" Reject C Callback\n " );
138+ printf (" Reject C Callback\n " );
126139
127- ++success_callbacks;
140+ ++success_callbacks;
128141
129- return metacall_value_create_double (15.0 ); }, static_cast <void *>(&ctx));
142+ return metacall_value_create_double (15.0 );
143+ },
144+ static_cast <void *>(&ctx));
130145
131146 EXPECT_NE ((void *)NULL , (void *)future);
132147
@@ -144,21 +159,26 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
144159 EXPECT_EQ ((enum metacall_value_id)metacall_value_id (future), (enum metacall_value_id)METACALL_FUTURE);
145160
146161 void *ret = metacall_await_future (
147- metacall_value_to_future (future), [](void *result, void *) -> void * {
148- EXPECT_NE ((void *) NULL , (void *) result);
162+ metacall_value_to_future (future),
163+ [](void *result, void *) -> void * {
164+ EXPECT_NE ((void *)NULL , (void *)result);
149165
150- EXPECT_EQ ((enum metacall_value_id) metacall_value_id (result), (enum metacall_value_id) METACALL_DOUBLE);
166+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (result), (enum metacall_value_id)METACALL_DOUBLE);
151167
152- EXPECT_EQ ((double ) 34.0 , (double ) metacall_value_to_double (result));
168+ EXPECT_EQ ((double )34.0 , (double )metacall_value_to_double (result));
153169
154- ++success_callbacks;
170+ ++success_callbacks;
155171
156- return metacall_value_create_double (155.0 ); }, [](void *, void *) -> void * {
157- int this_should_never_be_executed = 0 ;
172+ return metacall_value_create_double (155.0 );
173+ },
174+ [](void *, void *) -> void * {
175+ int this_should_never_be_executed = 0 ;
158176
159- EXPECT_EQ ((int ) 1 , (int ) this_should_never_be_executed);
177+ EXPECT_EQ ((int )1 , (int )this_should_never_be_executed);
160178
161- return NULL ; }, NULL );
179+ return NULL ;
180+ },
181+ NULL );
162182
163183 metacall_value_destroy (future);
164184
@@ -167,25 +187,68 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
167187 EXPECT_EQ ((enum metacall_value_id)metacall_value_id (ret), (enum metacall_value_id)METACALL_FUTURE);
168188
169189 void *last = metacall_await_future (
170- metacall_value_to_future (ret), [](void *result, void *) -> void * {
171- EXPECT_NE ((void *) NULL , (void *) result);
190+ metacall_value_to_future (ret),
191+ [](void *result, void *) -> void * {
192+ EXPECT_NE ((void *)NULL , (void *)result);
172193
173- EXPECT_EQ ((enum metacall_value_id) metacall_value_id (result), (enum metacall_value_id) METACALL_DOUBLE);
194+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (result), (enum metacall_value_id)METACALL_DOUBLE);
174195
175- EXPECT_EQ ((double ) 155.0 , (double ) metacall_value_to_double (result));
196+ EXPECT_EQ ((double )155.0 , (double )metacall_value_to_double (result));
176197
177- ++success_callbacks;
198+ ++success_callbacks;
178199
179- return NULL ; }, [](void *, void *) -> void * {
180- int this_should_never_be_executed = 0 ;
200+ return NULL ;
201+ },
202+ [](void *, void *) -> void * {
203+ int this_should_never_be_executed = 0 ;
181204
182- EXPECT_EQ ((int ) 1 , (int ) this_should_never_be_executed);
205+ EXPECT_EQ ((int )1 , (int )this_should_never_be_executed);
183206
184- return NULL ; }, NULL );
207+ return NULL ;
208+ },
209+ NULL );
185210
186211 metacall_value_destroy (last);
187212
188213 metacall_value_destroy (ret);
214+
215+ /* Test throw exception inside async function */
216+ future = metacall_await (
217+ " i" ,
218+ metacall_null_args,
219+ [](void *, void *) -> void * {
220+ int this_should_never_be_executed = 0 ;
221+
222+ EXPECT_EQ ((int )1 , (int )this_should_never_be_executed);
223+
224+ printf (" Resolve C Callback\n " );
225+
226+ return NULL ;
227+ },
228+ [](void *result, void *data) -> void * {
229+ EXPECT_NE ((void *)NULL , (void *)result);
230+
231+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (result), (enum metacall_value_id)METACALL_EXCEPTION);
232+
233+ EXPECT_NE ((void *)NULL , (void *)data);
234+
235+ struct async_context *ctx = static_cast <struct async_context *>(data);
236+
237+ EXPECT_EQ ((int )234 , (int )ctx->value );
238+
239+ printf (" Reject C Callback\n " );
240+
241+ ++success_callbacks;
242+
243+ return metacall_value_create_double (15.0 );
244+ },
245+ static_cast <void *>(&ctx));
246+
247+ EXPECT_NE ((void *)NULL , (void *)future);
248+
249+ EXPECT_EQ ((enum metacall_value_id)metacall_value_id (future), (enum metacall_value_id)METACALL_FUTURE);
250+
251+ metacall_value_destroy (future);
189252 }
190253#endif /* OPTION_BUILD_LOADERS_NODE */
191254
@@ -194,8 +257,8 @@ TEST_F(metacall_node_async_test, DefaultConstructor)
194257/* NodeJS */
195258#if defined(OPTION_BUILD_LOADERS_NODE)
196259 {
197- /* Total amount of successful callbacks must be 3 */
198- EXPECT_EQ ((int )success_callbacks, (int )3 );
260+ /* Total amount of successful callbacks must be 4 */
261+ EXPECT_EQ ((int )success_callbacks, (int )4 );
199262 }
200263#endif /* OPTION_BUILD_LOADERS_NODE */
201264}
0 commit comments