@@ -406,3 +406,38 @@ TEST(WhenAny, AlreadyResolved) {
406406 ASSERT_TRUE (r.has_value ());
407407 EXPECT_EQ (*r, 0u );
408408}
409+
410+ TEST (WhenAll, ConcurrentResolution) {
411+ auto spawn = [](int val) {
412+ Promise<int > p;
413+ Future<int > f = p.GetFuture ();
414+ return std::make_pair (
415+ f, std::thread ([p = std::move (p), val]() mutable {
416+ std::this_thread::sleep_for (std::chrono::milliseconds (10 ));
417+ p.Resolve (val);
418+ }));
419+ };
420+
421+ auto [f1, t1] = spawn (1 );
422+ auto [f2, t2] = spawn (2 );
423+ auto [f3, t3] = spawn (3 );
424+ auto [f4, t4] = spawn (4 );
425+ auto [f5, t5] = spawn (5 );
426+
427+ auto result = WhenAll (f1, f2, f3, f4, f5);
428+
429+ auto r = result.WaitForResult (std::chrono::seconds (5 ));
430+ ASSERT_TRUE (r.has_value ());
431+
432+ EXPECT_EQ (f1.GetResult ().value (), 1 );
433+ EXPECT_EQ (f2.GetResult ().value (), 2 );
434+ EXPECT_EQ (f3.GetResult ().value (), 3 );
435+ EXPECT_EQ (f4.GetResult ().value (), 4 );
436+ EXPECT_EQ (f5.GetResult ().value (), 5 );
437+
438+ t1.join ();
439+ t2.join ();
440+ t3.join ();
441+ t4.join ();
442+ t5.join ();
443+ }
0 commit comments