tst_QPromise: DRY the inspection of QFuture's handlers
Not all test cases inspect all of failed, then, and canceled, but it doesn't hurt to always collect all three. Avoids having to write the same type of code over and over again. Amends bf3fc5c95cb4e6acedf242c00b7a1c3b455062bb (but really 1f22fc995a36193cd67e8190858bb33614d149f4 and 855c4484693015cb6498f2183d95de1377d49898, which each duplicated the initial pattern without refactoring). Pick-to: 6.5 6.2 Change-Id: Ifb2a3589f8aed9017fbdff20e4edb64e8c9e2488 Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> (cherry picked from commit 9d0da873f0ddadb60e61fbd6c96c8b00f026e99f) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
ab4919f316
commit
7be419bb23
@ -105,6 +105,31 @@ struct ThreadWrapper
|
||||
};
|
||||
#endif
|
||||
|
||||
struct FutureWatcher
|
||||
{
|
||||
bool thenCalled = false;
|
||||
bool onFailedCalled = false;
|
||||
bool onCanceledCalled = false;
|
||||
|
||||
FutureWatcher() = default;
|
||||
Q_DISABLE_COPY_MOVE(FutureWatcher)
|
||||
|
||||
template <typename T>
|
||||
explicit FutureWatcher(QFuture<T> &f) { setFuture(f); }
|
||||
|
||||
template <typename T>
|
||||
void setFuture(QFuture<T> &f)
|
||||
{
|
||||
f.onFailed([&]{
|
||||
onFailedCalled = true;
|
||||
if constexpr (!std::is_void_v<T>)
|
||||
return T{};
|
||||
})
|
||||
.then([&](auto&&...) { thenCalled = true; })
|
||||
.onCanceled([&]{ onCanceledCalled = true; });
|
||||
}
|
||||
};
|
||||
|
||||
void tst_QPromise::promise()
|
||||
{
|
||||
const auto testCanCreatePromise = [] (auto promise) {
|
||||
@ -540,20 +565,15 @@ template <typename T>
|
||||
static inline void testCancelWhenDestroyedRunsContinuations()
|
||||
{
|
||||
QFuture<T> future;
|
||||
bool onCanceledCalled = false;
|
||||
bool thenCalled = false;
|
||||
FutureWatcher r;
|
||||
{
|
||||
QPromise<T> promise;
|
||||
future = promise.future();
|
||||
future.then([&] (auto&&) {
|
||||
thenCalled = true;
|
||||
}).onCanceled([&] () {
|
||||
onCanceledCalled = true;
|
||||
});
|
||||
r.setFuture(future);
|
||||
}
|
||||
QVERIFY(future.isFinished());
|
||||
QVERIFY(!thenCalled);
|
||||
QVERIFY(onCanceledCalled);
|
||||
QVERIFY(!r.thenCalled);
|
||||
QVERIFY(r.onCanceledCalled);
|
||||
}
|
||||
|
||||
void tst_QPromise::cancelWhenDestroyedRunsContinuations()
|
||||
@ -568,24 +588,15 @@ template <typename T>
|
||||
static inline void testCancelWhenDestroyedWithFailureHandler()
|
||||
{
|
||||
QFuture<T> future;
|
||||
bool onFailedCalled = false;
|
||||
bool thenCalled = false;
|
||||
FutureWatcher r;
|
||||
{
|
||||
QPromise<T> promise;
|
||||
future = promise.future();
|
||||
future
|
||||
.onFailed([&] () {
|
||||
onFailedCalled = true;
|
||||
if constexpr (!std::is_same_v<void, T>)
|
||||
return T{};
|
||||
})
|
||||
.then([&] (auto&&) {
|
||||
thenCalled = true;
|
||||
});
|
||||
r.setFuture(future);
|
||||
}
|
||||
QVERIFY(future.isFinished());
|
||||
QVERIFY(!onFailedCalled);
|
||||
QVERIFY(!thenCalled);
|
||||
QVERIFY(!r.onFailedCalled);
|
||||
QVERIFY(!r.thenCalled);
|
||||
}
|
||||
|
||||
void tst_QPromise::cancelWhenDestroyedWithFailureHandler()
|
||||
@ -606,10 +617,7 @@ static inline void testContinuationsRunWhenFinished()
|
||||
QPromise<T> promise;
|
||||
QFuture<T> future = promise.future();
|
||||
|
||||
bool thenCalled = false;
|
||||
future.then([&] (auto&&) {
|
||||
thenCalled = true;
|
||||
});
|
||||
FutureWatcher r(future);
|
||||
|
||||
promise.start();
|
||||
if constexpr (!std::is_void_v<T>) {
|
||||
@ -617,7 +625,7 @@ static inline void testContinuationsRunWhenFinished()
|
||||
}
|
||||
promise.finish();
|
||||
|
||||
QVERIFY(thenCalled);
|
||||
QVERIFY(r.thenCalled);
|
||||
}
|
||||
|
||||
void tst_QPromise::continuationsRunWhenFinished()
|
||||
|
Loading…
x
Reference in New Issue
Block a user