| 32 | }; |
| 33 | |
| 34 | TEST_F(LatchTest, testWorkDone) { |
| 35 | struct job { |
| 36 | const std::string name; |
| 37 | std::string product{"not worked"}; |
| 38 | |
| 39 | } jobs[] = {{"annika"}, {"buru"}, {"chuck"}}; |
| 40 | |
| 41 | Latch work_done{std::size(jobs)}; |
| 42 | Latch start_up{1}; |
| 43 | |
| 44 | auto work = [&](job& my_job) -> Lazy<> { |
| 45 | co_await start_up.wait(); |
| 46 | EXPECT_EQ(my_job.product, my_job.name + " worked"); |
| 47 | |
| 48 | my_job.product = my_job.name + " done"; |
| 49 | co_await work_done.count_down(); |
| 50 | }; |
| 51 | |
| 52 | std::cout << "Work starting... "; |
| 53 | for (auto& job : jobs) { |
| 54 | auto lazy = work(job).via(&_executor); |
| 55 | lazy.detach(); |
| 56 | } |
| 57 | |
| 58 | auto wait_lazy = [&]() -> Lazy<> { |
| 59 | std::cout << "done\n"; |
| 60 | for (auto& job : jobs) { |
| 61 | job.product = job.name + " worked"; |
| 62 | } |
| 63 | co_await start_up.count_down(); |
| 64 | |
| 65 | co_await work_done.wait(); |
| 66 | |
| 67 | std::cout << "Workers finished... "; |
| 68 | for (auto const& job : jobs) { |
| 69 | EXPECT_EQ(job.product, job.name + " done"); |
| 70 | } |
| 71 | std::cout << "done\n"; |
| 72 | }; |
| 73 | |
| 74 | syncAwait(wait_lazy().via(&_executor)); |
| 75 | } |
| 76 | |
| 77 | } // namespace async_simple::coro |