@@ -248,6 +248,102 @@ static em_promise_result_t test_all(void** result, void* data, void* value) {
248248 return EM_PROMISE_MATCH_RELEASE ;
249249}
250250
251+ typedef struct promise_all_settled_state {
252+ size_t size ;
253+ em_promise_t in [3 ];
254+ em_settled_result_t out [3 ];
255+ em_settled_result_t expected [3 ];
256+ } promise_all_settled_state ;
257+
258+ static em_promise_result_t
259+ check_promise_all_settled_results (void * * result , void * data , void * value ) {
260+ promise_all_settled_state * state = (promise_all_settled_state * )data ;
261+ assert (value == state -> out );
262+ emscripten_console_log ("promise_all_settled results:" );
263+ for (size_t i = 0 ; i < state -> size ; ++ i ) {
264+ emscripten_console_logf (
265+ "%s %ld" ,
266+ state -> out [i ].result == EM_PROMISE_FULFILL ? "fulfill" : "reject" ,
267+ (uintptr_t )state -> out [i ].value );
268+ assert (state -> out [i ].result == state -> expected [i ].result );
269+ assert (state -> out [i ].value == state -> expected [i ].value );
270+ }
271+ free (state );
272+ return EM_PROMISE_FULFILL ;
273+ }
274+
275+ static em_promise_result_t check_null (void * * result , void * data , void * value ) {
276+ assert (value == NULL );
277+ return EM_PROMISE_FULFILL ;
278+ }
279+
280+ static em_promise_result_t
281+ test_all_settled (void * * result , void * data , void * value ) {
282+ emscripten_console_log ("test_all_settled" );
283+ assert (data == (void * )5 );
284+
285+ // No input should be handled ok.
286+ promise_all_settled_state * state = malloc (sizeof (promise_all_settled_state ));
287+ * state =
288+ (promise_all_settled_state ){.size = 0 , .in = {}, .out = {}, .expected = {}};
289+ em_promise_t empty =
290+ emscripten_promise_all_settled (state -> in , state -> out , state -> size );
291+ em_promise_t empty_checked = emscripten_promise_then (
292+ empty , check_promise_all_settled_results , fail , state );
293+ emscripten_promise_destroy (empty );
294+
295+ // Fulfilled and rejected inputs should be reported.
296+ state = malloc (sizeof (promise_all_settled_state ));
297+ * state = (promise_all_settled_state ){.size = 3 ,
298+ .in = {emscripten_promise_create (),
299+ emscripten_promise_create (),
300+ emscripten_promise_create ()},
301+ .out = {},
302+ .expected = {
303+ {EM_PROMISE_FULFILL , (void * )42 },
304+ {EM_PROMISE_REJECT , (void * )43 },
305+ {EM_PROMISE_FULFILL , (void * )44 },
306+ }};
307+ em_promise_t full =
308+ emscripten_promise_all_settled (state -> in , state -> out , state -> size );
309+ em_promise_t full_checked = emscripten_promise_then (
310+ full , check_promise_all_settled_results , fail , state );
311+ emscripten_promise_destroy (full );
312+ emscripten_promise_resolve (state -> in [0 ], EM_PROMISE_FULFILL , (void * )42 );
313+ emscripten_promise_resolve (state -> in [1 ], EM_PROMISE_REJECT , (void * )43 );
314+ emscripten_promise_resolve (state -> in [2 ], EM_PROMISE_FULFILL , (void * )44 );
315+ emscripten_promise_destroy (state -> in [0 ]);
316+ emscripten_promise_destroy (state -> in [1 ]);
317+ emscripten_promise_destroy (state -> in [2 ]);
318+
319+ // Null buffer should be ok.
320+ em_promise_t null_in [3 ] = {
321+ emscripten_promise_create (),
322+ emscripten_promise_create (),
323+ emscripten_promise_create (),
324+ };
325+ em_promise_t null = emscripten_promise_all_settled (null_in , NULL , 3 );
326+ em_promise_t null_checked =
327+ emscripten_promise_then (null , check_null , fail , NULL );
328+ emscripten_promise_destroy (null );
329+ emscripten_promise_resolve (null_in [0 ], EM_PROMISE_REJECT , (void * )42 );
330+ emscripten_promise_resolve (null_in [1 ], EM_PROMISE_FULFILL , (void * )43 );
331+ emscripten_promise_resolve (null_in [2 ], EM_PROMISE_REJECT , (void * )44 );
332+ emscripten_promise_destroy (null_in [0 ]);
333+ emscripten_promise_destroy (null_in [1 ]);
334+ emscripten_promise_destroy (null_in [2 ]);
335+
336+ em_promise_t to_finish [3 ] = {empty_checked , full_checked , null_checked };
337+ em_promise_t finish_test_all = emscripten_promise_all (to_finish , NULL , 3 );
338+
339+ emscripten_promise_destroy (empty_checked );
340+ emscripten_promise_destroy (full_checked );
341+ emscripten_promise_destroy (null_checked );
342+
343+ * result = finish_test_all ;
344+ return EM_PROMISE_MATCH_RELEASE ;
345+ }
346+
251347static em_promise_result_t finish (void * * result , void * data , void * value ) {
252348 emscripten_console_logf ("finish" );
253349
@@ -292,8 +388,10 @@ int main() {
292388 em_promise_t test3 =
293389 emscripten_promise_then (test2 , test_rejection , fail , (void * )3 );
294390 em_promise_t test4 = emscripten_promise_then (test3 , test_all , fail , (void * )4 );
391+ em_promise_t test5 =
392+ emscripten_promise_then (test4 , test_all_settled , fail , (void * )5 );
295393 em_promise_t assert_stack =
296- emscripten_promise_then (test4 , check_stack , fail , NULL );
394+ emscripten_promise_then (test5 , check_stack , fail , NULL );
297395 em_promise_t end = emscripten_promise_then (assert_stack , finish , fail , NULL );
298396
299397 emscripten_promise_resolve (start , EM_PROMISE_FULFILL , NULL );
@@ -304,6 +402,7 @@ int main() {
304402 emscripten_promise_destroy (test2 );
305403 emscripten_promise_destroy (test3 );
306404 emscripten_promise_destroy (test4 );
405+ emscripten_promise_destroy (test5 );
307406 emscripten_promise_destroy (assert_stack );
308407 emscripten_promise_destroy (end );
309408
0 commit comments