diff options
Diffstat (limited to 'src/mongo/util/future_test_future_move_only.cpp')
-rw-r--r-- | src/mongo/util/future_test_future_move_only.cpp | 624 |
1 files changed, 287 insertions, 337 deletions
diff --git a/src/mongo/util/future_test_future_move_only.cpp b/src/mongo/util/future_test_future_move_only.cpp index 41b4a711788..3047d4ab19d 100644 --- a/src/mongo/util/future_test_future_move_only.cpp +++ b/src/mongo/util/future_test_future_move_only.cpp @@ -54,12 +54,8 @@ struct Widget { Widget(const Widget&) = delete; Widget& operator=(const Widget&) = delete; - Widget operator+(int i) const { - return Widget(val + i); - } - - bool operator==(int i) const { - return val == i; + friend Widget operator+(const Widget& w, int i) { + return Widget(w.val + i); } friend bool operator==(const Widget& a, const Widget& b) { @@ -81,123 +77,108 @@ std::ostream& operator<<(std::ostream& stream, const Widget& widget) { return stream << "Widget(" << widget.val << ')'; } +/* Run the success tests using a Widget(1) completion function. */ +template <DoExecutorFuture doExecutorFuture = kDoExecutorFuture, typename F> +void runTests(F&& f) { + FUTURE_SUCCESS_TEST<doExecutorFuture>([] { return Widget(1); }, std::forward<F>(f)); +} + TEST(Future_MoveOnly, Success_getLvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(fut.get(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(fut.get(), Widget(1)); }); } TEST(Future_MoveOnly, Success_getConstLvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](const /*Future<Widget>*/ auto& fut) { ASSERT_EQ(fut.get(), 1); }); + runTests([](const auto& fut) { ASSERT_EQ(fut.get(), Widget(1)); }); } TEST(Future_MoveOnly, Success_getRvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(std::move(fut).get(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(std::move(fut).get(), Widget(1)); }); } TEST(Future_MoveOnly, Success_semi_get) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(std::move(fut).semi().get(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(std::move(fut).semi().get(), Widget(1)); }); } #if 0 // Needs copy TEST(Future_MoveOnly, Success_shared_get) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(std::move(fut).share().get(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(std::move(fut).share().get(), Widget(1)); }); } TEST(Future_MoveOnly, Success_getNothrowLvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(fut.getNoThrow(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(fut.getNoThrow(), Widget(1)); }); } TEST(Future_MoveOnly, Success_getNothrowConstLvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](const /*Future<Widget>*/ auto& fut) { ASSERT_EQ(fut.getNoThrow(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(fut.getNoThrow(), Widget(1)); }); } TEST(Future_MoveOnly, Success_shared_getNothrow) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(std::move(fut).share().getNoThrow(), 1); }); + runTests([](auto&& fut) { ASSERT_EQ(std::move(fut).share().getNoThrow(), Widget(1)); }); } #endif TEST(Future_MoveOnly, Success_getNothrowRvalue) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(uassertStatusOK(std::move(fut).getNoThrow()).val, 1); - }); + runTests([](auto&& fut) { ASSERT_EQ(uassertStatusOK(std::move(fut).getNoThrow()).val, 1); }); } TEST(Future_MoveOnly, Success_getAsync) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - auto pf = makePromiseFuture<Widget>(); - std::move(fut).getAsync( - [outside = std::move(pf.promise)](StatusWith<Widget> sw) mutable { - ASSERT_OK(sw); - outside.emplaceValue(std::move(sw.getValue())); - }); - ASSERT_EQ(std::move(pf.future).get(), 1); - }); + runTests([](auto&& fut) { + auto pf = makePromiseFuture<Widget>(); + std::move(fut).getAsync([outside = std::move(pf.promise)](StatusWith<Widget> sw) mutable { + ASSERT_OK(sw); + outside.emplaceValue(std::move(sw.getValue())); + }); + ASSERT_EQ(std::move(pf.future).get(), Widget(1)); + }); } TEST(Future_MoveOnly, Fail_getLvalue) { - FUTURE_FAIL_TEST<Widget>( - [](/*Future<Widget>*/ auto&& fut) { ASSERT_THROWS_failStatus(fut.get()); }); + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_THROWS_failStatus(fut.get()); }); } TEST(Future_MoveOnly, Fail_getConstLvalue) { - FUTURE_FAIL_TEST<Widget>( - [](const /*Future<Widget>*/ auto& fut) { ASSERT_THROWS_failStatus(fut.get()); }); + FUTURE_FAIL_TEST<Widget>([](const auto& fut) { ASSERT_THROWS_failStatus(fut.get()); }); } TEST(Future_MoveOnly, Fail_getRvalue) { - FUTURE_FAIL_TEST<Widget>( - [](/*Future<Widget>*/ auto&& fut) { ASSERT_THROWS_failStatus(std::move(fut).get()); }); + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_THROWS_failStatus(std::move(fut).get()); }); } TEST(Future_MoveOnly, Fail_semi_get) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { - ASSERT_THROWS_failStatus(std::move(fut).semi().get()); - }); + FUTURE_FAIL_TEST<Widget>( + [](auto&& fut) { ASSERT_THROWS_failStatus(std::move(fut).semi().get()); }); } #if 0 // Needs copy TEST(Future_MoveOnly, Fail_shared_get) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_THROWS_failStatus(std::move(fut).share().get()); }); } TEST(Future_MoveOnly, Fail_getNothrowLvalue) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { ASSERT_EQ(fut.getNoThrow(), failStatus); }); + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(fut.getNoThrow(), failStatus); }); } TEST(Future_MoveOnly, Fail_getNothrowConstLvalue) { FUTURE_FAIL_TEST<Widget>( - [](const /*Future<Widget>*/ auto& fut) { ASSERT_EQ(fut.getNoThrow(), failStatus); }); + [](const auto& fut) { ASSERT_EQ(fut.getNoThrow(), failStatus); }); } TEST(Future_MoveOnly, Fail_shared_getNothrow) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut).share().getNoThrow().getStatus(), failStatus()); }); } #endif TEST(Future_MoveOnly, Fail_getNothrowRvalue) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut).getNoThrow().getStatus(), failStatus()); - }); + FUTURE_FAIL_TEST<Widget>( + [](auto&& fut) { ASSERT_EQ(std::move(fut).getNoThrow().getStatus(), failStatus()); }); } TEST(Future_MoveOnly, Fail_getAsync) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { auto pf = makePromiseFuture<Widget>(); std::move(fut).getAsync([outside = std::move(pf.promise)](StatusWith<Widget> sw) mutable { ASSERT(!sw.isOK()); @@ -208,135 +189,121 @@ TEST(Future_MoveOnly, Fail_getAsync) { } TEST(Future_MoveOnly, Success_thenSimple) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut).then([](Widget i) { return i + 2; }).get(), 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut).then([](Widget i) FTU_LAMBDA_R(Widget) { return i + 2; }).get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenSimpleAuto) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut).then([](auto&& i) { return i + 2; }).get(), 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut).then([](auto&& i) { return i + 2; }).get(), Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenVoid) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([](Widget i) { ASSERT_EQ(i, 1); }) - .then([] { return Widget(3); }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([](Widget i) FTU_LAMBDA_R(void) { ASSERT_EQ(i, Widget(1)); }) + .then([]() FTU_LAMBDA_R(Widget) { return Widget(3); }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenStatus) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([](Widget i) { - ASSERT_EQ(i, 1); - return Status::OK(); - }) - .then([] { return Widget(3); }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([](Widget i) FTU_LAMBDA_R(Status) { + ASSERT_EQ(i, Widget(1)); + return Status::OK(); + }) + .then([] { return Widget(3); }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenError_Status) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).then( - [](Widget i) { return Status(ErrorCodes::BadValue, "oh no!"); }); - static_assert(future_details::isFutureLike<decltype(fut2)>); - static_assert( - std::is_same_v<typename decltype(fut2)::value_type, void>); - ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); - }); + runTests([](auto&& fut) { + auto fut2 = std::move(fut).then( + [](Widget i) FTU_LAMBDA_R(Status) { return Status(ErrorCodes::BadValue, "oh no!"); }); + static_assert(future_details::isFutureLike<decltype(fut2)>); + static_assert(std::is_same_v<typename decltype(fut2)::value_type, void>); + ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Success_thenError_StatusWith) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).then( - [](Widget i) { return StatusWith<double>(ErrorCodes::BadValue, "oh no!"); }); - static_assert(future_details::isFutureLike<decltype(fut2)>); - static_assert(std::is_same_v<typename decltype(fut2)::value_type, double>); - ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + runTests([](auto&& fut) { + auto fut2 = std::move(fut).then([](Widget i) FTU_LAMBDA_R(StatusWith<double>) { + return StatusWith<double>(ErrorCodes::BadValue, "oh no!"); }); + static_assert(future_details::isFutureLike<decltype(fut2)>); + static_assert(std::is_same_v<typename decltype(fut2)::value_type, double>); + ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Success_thenFutureImmediate) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([](Widget i) { return Future<Widget>::makeReady(Widget(i + 2)); }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([](Widget i) FTU_LAMBDA_R(Future<Widget>) { + return Future<Widget>::makeReady(Widget(i + 2)); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenFutureReady) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([](Widget i) { - auto pf = makePromiseFuture<Widget>(); - pf.promise.emplaceValue(i + 2); - return std::move(pf.future); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([](Widget i) FTU_LAMBDA_R(Future<Widget>) { + auto pf = makePromiseFuture<Widget>(); + pf.promise.emplaceValue(i + 2); + return std::move(pf.future); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenFutureAsync) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([&](Widget i) { - return async([i = i.val] { return Widget(i + 2); }); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([&](Widget i) { return async([i = i.val] { return Widget(i + 2); }); }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenSemiFutureAsync) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ( - std::move(fut) - .then([&](Widget i) { - return async([i = i.val] { return Widget(i + 2); }).semi(); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ( + std::move(fut) + .then([&](Widget i) { return async([i = i.val] { return Widget(i + 2); }).semi(); }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_thenFutureAsyncThrow) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .then([](Widget i) { - uasserted(ErrorCodes::BadValue, "oh no!"); - return Future<Widget>(); - }) - .getNoThrow(), - ErrorCodes::BadValue); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .then([](Widget i) { + uasserted(ErrorCodes::BadValue, "oh no!"); + return Future<Widget>(); + }) + .getNoThrow(), + ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Fail_thenSimple) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .then([](Widget i) { + .then([](Widget i) FTU_LAMBDA_R(Widget) { FAIL("then() callback was called"); return Widget(0); }) @@ -346,9 +313,9 @@ TEST(Future_MoveOnly, Fail_thenSimple) { } TEST(Future_MoveOnly, Fail_thenFutureAsync) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .then([](Widget i) { + .then([](Widget i) FTU_LAMBDA_R(Future<Widget>) { FAIL("then() callback was called"); return Future<Widget>(); }) @@ -358,46 +325,44 @@ TEST(Future_MoveOnly, Fail_thenFutureAsync) { } TEST(Future_MoveOnly, Success_onErrorSimple) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onError([](Status) { - FAIL("onError() callback was called"); - return Widget(0); - }) - .then([](Widget i) { return i + 2; }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onError([](Status) FTU_LAMBDA_R(Widget) { + FAIL("onError() callback was called"); + return Widget(0); + }) + .then([](Widget i) FTU_LAMBDA_R(Widget) { return i + 2; }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onErrorFutureAsync) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onError([](Status) { - FAIL("onError() callback was called"); - return Future<Widget>(); - }) - .then([](Widget i) { return i + 2; }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onError([](Status) FTU_LAMBDA_R(Future<Widget>) { + FAIL("onError() callback was called"); + return Future<Widget>(); + }) + .then([](Widget i) FTU_LAMBDA_R(Widget) { return i + 2; }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Fail_onErrorSimple) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(uassertStatusOK(std::move(fut) - .onError([](Status s) { + .onError([](Status s) FTU_LAMBDA_R(Widget) { ASSERT_EQ(s, failStatus()); return Widget(3); }) .getNoThrow()), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Fail_onErrorError_throw) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { auto fut2 = std::move(fut).onError([](Status s) -> Widget { ASSERT_EQ(s, failStatus()); uasserted(ErrorCodes::BadValue, "oh no!"); @@ -407,8 +372,8 @@ TEST(Future_MoveOnly, Fail_onErrorError_throw) { } TEST(Future_MoveOnly, Fail_onErrorError_StatusWith) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).onError([](Status s) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { + auto fut2 = std::move(fut).onError([](Status s) FTU_LAMBDA_R(StatusWith<Widget>) { ASSERT_EQ(s, failStatus()); return StatusWith<Widget>(ErrorCodes::BadValue, "oh no!"); }); @@ -417,77 +382,72 @@ TEST(Future_MoveOnly, Fail_onErrorError_StatusWith) { } TEST(Future_MoveOnly, Fail_onErrorFutureImmediate) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onError([](Status s) { + .onError([](Status s) FTU_LAMBDA_R(Future<Widget>) { ASSERT_EQ(s, failStatus()); return Future<Widget>::makeReady(Widget(3)); }) .get(), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Fail_onErrorFutureReady) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onError([](Status s) { + .onError([](Status s) FTU_LAMBDA_R(Future<Widget>) { ASSERT_EQ(s, failStatus()); auto pf = makePromiseFuture<Widget>(); pf.promise.emplaceValue(3); return std::move(pf.future); }) .get(), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Fail_onErrorFutureAsync) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onError([&](Status s) { + .onError([&](Status s) FTU_LAMBDA_R(Future<Widget>) { ASSERT_EQ(s, failStatus()); return async([] { return Widget(3); }); }) .get(), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Success_tap) { - FUTURE_SUCCESS_TEST<kNoExecutorFuture_needsTap>( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - bool tapCalled = false; - ASSERT_EQ(std::move(fut) - .tap([&tapCalled](const Widget& i) { - ASSERT_EQ(i, 1); - tapCalled = true; - }) - .then([](Widget i) { return i + 2; }) - .get(), - 3); - ASSERT(tapCalled); - }); + runTests<kNoExecutorFuture_needsTap>([](auto&& fut) { + bool tapCalled = false; + ASSERT_EQ(std::move(fut) + .tap([&tapCalled](const Widget& i) { + ASSERT_EQ(i, Widget(1)); + tapCalled = true; + }) + .then([](Widget i) FTU_LAMBDA_R(Widget) { return i + 2; }) + .get(), + Widget(3)); + ASSERT(tapCalled); + }); } TEST(Future_MoveOnly, Success_tapError) { - FUTURE_SUCCESS_TEST<kNoExecutorFuture_needsTap>( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .tapError([](Status s) { FAIL("tapError() callback was called"); }) - .then([](Widget i) { return i + 2; }) - .get(), - 3); - }); + runTests<kNoExecutorFuture_needsTap>([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .tapError([](Status s) + FTU_LAMBDA_R(void) { FAIL("tapError() callback was called"); }) + .then([](Widget i) FTU_LAMBDA_R(Widget) { return i + 2; }) + .get(), + Widget(3)); + }); } #if 0 // Needs copy TEST(Future_MoveOnly, Success_tapAll_StatusWith) { - FUTURE_SUCCESS_TEST<kNoExecutorFuture_needsTap>( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { + runTests<kNoExecutorFuture_needsTap>([](auto&& fut) { bool tapCalled = false; ASSERT_EQ(std::move(fut) .tapAll([&tapCalled](StatusWith<Widget> sw) { @@ -496,46 +456,46 @@ TEST(Future_MoveOnly, Success_tapAll_StatusWith) { }) .then([](Widget i) { return i + 2; }) .get(), - 3); + Widget(3)); ASSERT(tapCalled); }); } #endif TEST(Future_MoveOnly, Fail_tap) { - FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>([](auto&& fut) { ASSERT_EQ(std::move(fut) .tap([](const Widget& i) { FAIL("tap() callback was called"); }) - .onError([](Status s) { + .onError([](Status s) FTU_LAMBDA_R(Widget) { ASSERT_EQ(s, failStatus()); return Widget(3); }) .get(), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Fail_tapError) { - FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>([](auto&& fut) { bool tapCalled = false; ASSERT_EQ(std::move(fut) .tapError([&tapCalled](Status s) { ASSERT_EQ(s, failStatus()); tapCalled = true; }) - .onError([](Status s) { + .onError([](Status s) FTU_LAMBDA_R(Widget) { ASSERT_EQ(s, failStatus()); return Widget(3); }) .get(), - 3); + Widget(3)); ASSERT(tapCalled); }); } #if 0 // Needs copy TEST(Future_MoveOnly, Fail_tapAll_StatusWith) { - FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>( [](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget, kNoExecutorFuture_needsTap>( [](auto&& fut) { bool tapCalled = false; ASSERT_EQ(std::move(fut) .tapAll([&tapCalled](StatusWith<Widget> sw) { @@ -554,130 +514,119 @@ TEST(Future_MoveOnly, Fail_tapAll_StatusWith) { #endif TEST(Future_MoveOnly, Success_onCompletionSimple) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { return i.getValue() + 2; }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) + FTU_LAMBDA_R(Widget) { return i.getValue() + 2; }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionVoid) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { ASSERT_EQ(i.getValue(), 1); }) - .onCompletion([](Status s) { - ASSERT_OK(s); - return Widget(3); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) + FTU_LAMBDA_R(void) { ASSERT_EQ(i.getValue(), Widget(1)); }) + .onCompletion([](Status s) FTU_LAMBDA_R(Widget) { + ASSERT_OK(s); + return Widget(3); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionStatus) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { - ASSERT_EQ(i.getValue(), 1); - return Status::OK(); - }) - .onCompletion([](Status s) { - ASSERT_OK(s); - return Widget(3); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Status) { + ASSERT_EQ(i.getValue(), Widget(1)); + return Status::OK(); + }) + .onCompletion([](Status s) FTU_LAMBDA_R(Widget) { + ASSERT_OK(s); + return Widget(3); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionError_Status) { - FUTURE_SUCCESS_TEST( - [] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).onCompletion( - [](StatusWith<Widget> i) { return Status(ErrorCodes::BadValue, "oh no!"); }); - static_assert(future_details::isFutureLike<decltype(fut2)>); - static_assert(std::is_same_v<typename decltype(fut2)::value_type, void>); - ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + runTests([](auto&& fut) { + auto fut2 = std::move(fut).onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Status) { + return Status(ErrorCodes::BadValue, "oh no!"); }); + static_assert(future_details::isFutureLike<decltype(fut2)>); + static_assert(std::is_same_v<typename decltype(fut2)::value_type, void>); + ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Success_onCompletionError_StatusWith) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).onCompletion([](StatusWith<Widget> i) { - return StatusWith<double>(ErrorCodes::BadValue, "oh no!"); - }); - static_assert(future_details::isFutureLike<decltype(fut2)>); - static_assert( - std::is_same_v<typename decltype(fut2)::value_type, double>); - ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); - }); + runTests([](auto&& fut) { + auto fut2 = + std::move(fut).onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(StatusWith<double>) { + return StatusWith<double>(ErrorCodes::BadValue, "oh no!"); + }); + static_assert(future_details::isFutureLike<decltype(fut2)>); + static_assert(std::is_same_v<typename decltype(fut2)::value_type, double>); + ASSERT_EQ(fut2.getNoThrow(), ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Success_onCompletionFutureImmediate) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { - return Future<Widget>::makeReady( - Widget(i.getValue() + 2)); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Future<Widget>) { + return Future<Widget>::makeReady(Widget(i.getValue() + 2)); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionFutureReady) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { - auto pf = makePromiseFuture<Widget>(); - pf.promise.emplaceValue(i.getValue() + 2); - return std::move(pf.future); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Future<Widget>) { + auto pf = makePromiseFuture<Widget>(); + pf.promise.emplaceValue(i.getValue() + 2); + return std::move(pf.future); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionFutureAsync) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([&](StatusWith<Widget> i) { - return async( - [i = i.getValue().val] { return Widget(i + 2); }); - }) - .get(), - 3); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([&](StatusWith<Widget> i) { + return async([i = i.getValue().val] { return Widget(i + 2); }); + }) + .get(), + Widget(3)); + }); } TEST(Future_MoveOnly, Success_onCompletionFutureAsyncThrow) { - FUTURE_SUCCESS_TEST([] { return Widget(1); }, - [](/*Future<Widget>*/ auto&& fut) { - ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { - uasserted(ErrorCodes::BadValue, "oh no!"); - return Future<Widget>(); - }) - .getNoThrow(), - ErrorCodes::BadValue); - }); + runTests([](auto&& fut) { + ASSERT_EQ(std::move(fut) + .onCompletion([](StatusWith<Widget> i) { + uasserted(ErrorCodes::BadValue, "oh no!"); + return Future<Widget>(); + }) + .getNoThrow(), + ErrorCodes::BadValue); + }); } TEST(Future_MoveOnly, Fail_onCompletionSimple) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { + .onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Status) { ASSERT_NOT_OK(i); return i.getStatus(); }) @@ -687,9 +636,9 @@ TEST(Future_MoveOnly, Fail_onCompletionSimple) { } TEST(Future_MoveOnly, Fail_onCompletionFutureAsync) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> i) { + .onCompletion([](StatusWith<Widget> i) FTU_LAMBDA_R(Status) { ASSERT_NOT_OK(i); return i.getStatus(); }) @@ -699,7 +648,7 @@ TEST(Future_MoveOnly, Fail_onCompletionFutureAsync) { } TEST(Future_MoveOnly, Fail_onCompletionError_throw) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { auto fut2 = std::move(fut).onCompletion([](StatusWith<Widget> s) -> Widget { ASSERT_EQ(s.getStatus(), failStatus()); uasserted(ErrorCodes::BadValue, "oh no!"); @@ -709,38 +658,39 @@ TEST(Future_MoveOnly, Fail_onCompletionError_throw) { } TEST(Future_MoveOnly, Fail_onCompletionError_StatusWith) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { - auto fut2 = std::move(fut).onCompletion([](StatusWith<Widget> s) { - ASSERT_EQ(s.getStatus(), failStatus()); - return StatusWith<Widget>(ErrorCodes::BadValue, "oh no!"); - }); + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { + auto fut2 = + std::move(fut).onCompletion([](StatusWith<Widget> s) FTU_LAMBDA_R(StatusWith<Widget>) { + ASSERT_EQ(s.getStatus(), failStatus()); + return StatusWith<Widget>(ErrorCodes::BadValue, "oh no!"); + }); ASSERT_EQ(std::move(fut2).getNoThrow(), ErrorCodes::BadValue); }); } TEST(Future_MoveOnly, Fail_onCompletionFutureImmediate) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> s) { + .onCompletion([](StatusWith<Widget> s) FTU_LAMBDA_R(Future<Widget>) { ASSERT_EQ(s.getStatus(), failStatus()); return Future<Widget>::makeReady(Widget(3)); }) .get(), - 3); + Widget(3)); }); } TEST(Future_MoveOnly, Fail_onCompletionFutureReady) { - FUTURE_FAIL_TEST<Widget>([](/*Future<Widget>*/ auto&& fut) { + FUTURE_FAIL_TEST<Widget>([](auto&& fut) { ASSERT_EQ(std::move(fut) - .onCompletion([](StatusWith<Widget> s) { + .onCompletion([](StatusWith<Widget> s) FTU_LAMBDA_R(Future<Widget>) { ASSERT_EQ(s.getStatus(), failStatus()); auto pf = makePromiseFuture<Widget>(); pf.promise.emplaceValue(3); return std::move(pf.future); }) .get(), - 3); + Widget(3)); }); } @@ -752,7 +702,7 @@ TEST(Future_MoveOnly, Success_vector) { vec.emplace_back(1); return vec; }, - [](auto&& fut) { ASSERT_EQ(fut.get()[0], 1); }); + [](auto&& fut) { ASSERT_EQ(fut.get()[0], Widget(1)); }); } TEST(Future_MoveOnly, Success_list) { @@ -762,7 +712,7 @@ TEST(Future_MoveOnly, Success_list) { lst.emplace_back(1); return lst; }, - [](auto&& fut) { ASSERT_EQ(fut.get().front(), 1); }); + [](auto&& fut) { ASSERT_EQ(fut.get().front(), Widget(1)); }); } TEST(Future_MoveOnly, Success_set) { @@ -792,8 +742,8 @@ TEST(Future_MoveOnly, Success_pair) { }, [](auto&& fut) { auto&& pair = fut.get(); - ASSERT_EQ(pair.first, 1); - ASSERT_EQ(pair.second, 1); + ASSERT_EQ(pair.first, Widget(1)); + ASSERT_EQ(pair.second, Widget(1)); }); } @@ -827,7 +777,7 @@ TEST(Future_MoveOnly, Success_nested_container) { return outer; }, - [](auto&& fut) { ASSERT_EQ(fut.get()[0][0], 1); }); + [](auto&& fut) { ASSERT_EQ(fut.get()[0][0], Widget(1)); }); } |