//Catch includes #include //Our includes #include "DebugStreams.h" #include "AsyncHelper.h" #include "ForkableFuture.h" TEST_CASE("ForkableFuture should be able to fork", "[ForkableFuture]") { auto future = QtConcurrent::run([]() { return 5; }); ForkableFuture forkableFuture(future); bool firstCalled = false; auto firstFuture = forkableFuture.then([&firstCalled](int x) { Q_ASSERT(x); firstCalled = true; }); bool secondCalled = false; auto secondFuture = forkableFuture.then([&secondCalled](int x) { Q_ASSERT(x); secondCalled = true; }); QList> futures = {firstFuture, secondFuture}; auto all = QtFuture::whenAll(futures.begin(), futures.end()); REQUIRE(AsyncHelper::waitForFinished(all, 1000)); CHECK(firstCalled); CHECK(secondCalled); } TEST_CASE("ForkableFuture with completed QFuture and multiple continuations", "[ForkableFuture]") { const int expectedResult = 42; // Create a completed QFuture auto completedFuture = QtFuture::makeReadyFuture(expectedResult); ForkableFuture forkableFuture(completedFuture); bool firstContinuationCalled = false; bool secondContinuationCalled = false; auto firstForkedFuture = forkableFuture.then([&firstContinuationCalled, expectedResult](int value) { firstContinuationCalled = true; REQUIRE(value == expectedResult); }); auto secondForkedFuture = forkableFuture.then([&secondContinuationCalled, expectedResult](int value) { secondContinuationCalled = true; REQUIRE(value == expectedResult); }); // Wait for both forked futures to complete firstForkedFuture.waitForFinished(); secondForkedFuture.waitForFinished(); REQUIRE(firstContinuationCalled); REQUIRE(secondContinuationCalled); }