From d3064231599a1b32e3595dd04dd67da7049bd84c Mon Sep 17 00:00:00 2001 From: Simon Brunel Date: Mon, 18 Sep 2017 23:33:44 +0200 Subject: [PATCH] Add QPromise assignment and equality operators --- src/qtpromise/qpromise.h | 19 +- src/qtpromise/qpromiseerror.h | 2 +- .../qpromise/operators/operators.pro | 4 + .../qpromise/operators/tst_operators.cpp | 230 ++++++++++++++++++ tests/auto/qtpromise/qpromise/qpromise.pro | 1 + 5 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 tests/auto/qtpromise/qpromise/operators/operators.pro create mode 100644 tests/auto/qtpromise/qpromise/operators/tst_operators.cpp diff --git a/src/qtpromise/qpromise.h b/src/qtpromise/qpromise.h index 8504ca0..d1c110f 100644 --- a/src/qtpromise/qpromise.h +++ b/src/qtpromise/qpromise.h @@ -16,18 +16,27 @@ class QPromiseBase public: using Type = T; - QPromiseBase(const QPromiseBase& other): m_d(other.m_d) {} - QPromiseBase(const QPromise& other): m_d(other.m_d) {} - QPromiseBase(QPromiseBase&& other) { swap(other); } - template ::count == 1, int>::type = 0> inline QPromiseBase(F resolver); template ::count != 1, int>::type = 0> inline QPromiseBase(F resolver); + QPromiseBase(const QPromiseBase& other): m_d(other.m_d) {} + QPromiseBase(const QPromise& other): m_d(other.m_d) {} + QPromiseBase(QPromiseBase&& other) Q_DECL_NOEXCEPT { swap(other); } + virtual ~QPromiseBase() { } + QPromiseBase& operator=(const QPromiseBase& other) { m_d = other.m_d; return *this;} + QPromiseBase& operator=(QPromiseBase&& other) Q_DECL_NOEXCEPT + { QPromiseBase(std::move(other)).swap(*this); return *this; } + + bool operator==(const QPromiseBase& other) const { return (m_d == other.m_d); } + bool operator!=(const QPromiseBase& other) const { return (m_d != other.m_d); } + + void swap(QPromiseBase& other) Q_DECL_NOEXCEPT { qSwap(m_d, other.m_d); } + bool isFulfilled() const { return m_d->isFulfilled(); } bool isRejected() const { return m_d->isRejected(); } bool isPending() const { return m_d->isPending(); } @@ -56,8 +65,6 @@ public: inline QPromise delay(int msec) const; inline QPromise wait() const; - void swap(QPromiseBase& other) { qSwap(m_d, other.m_d); } - public: // STATIC template inline static QPromise reject(E&& error); diff --git a/src/qtpromise/qpromiseerror.h b/src/qtpromise/qpromiseerror.h index 8bfc160..2392c97 100644 --- a/src/qtpromise/qpromiseerror.h +++ b/src/qtpromise/qpromiseerror.h @@ -36,7 +36,7 @@ public: swap(other); } - QPromiseError& operator =(QPromiseError other) + QPromiseError& operator=(QPromiseError other) { swap(other); return *this; diff --git a/tests/auto/qtpromise/qpromise/operators/operators.pro b/tests/auto/qtpromise/qpromise/operators/operators.pro new file mode 100644 index 0000000..784bf08 --- /dev/null +++ b/tests/auto/qtpromise/qpromise/operators/operators.pro @@ -0,0 +1,4 @@ +TARGET = tst_qpromise_operators +SOURCES += $$PWD/tst_operators.cpp + +include(../../qtpromise.pri) diff --git a/tests/auto/qtpromise/qpromise/operators/tst_operators.cpp b/tests/auto/qtpromise/qpromise/operators/tst_operators.cpp new file mode 100644 index 0000000..1332004 --- /dev/null +++ b/tests/auto/qtpromise/qpromise/operators/tst_operators.cpp @@ -0,0 +1,230 @@ +// Tests +#include "../../shared/utils.h" + +// QtPromise +#include + +// Qt +#include + +using namespace QtPromise; + +class tst_qpromise_operators : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void move(); + void move_void(); + void copy(); + void copy_void(); + void equalTo(); + void equalTo_void(); + void notEqualTo(); + void notEqualTo_void(); + void chaining(); + void chaining_void(); +}; + +QTEST_MAIN(tst_qpromise_operators) +#include "tst_operators.moc" + +void tst_qpromise_operators::move() +{ + auto p0 = QPromise::resolve(42); + + QCOMPARE(p0.isFulfilled(), true); + QCOMPARE(waitForValue(p0, -1), 42); + + p0 = QPromise([](const QPromiseResolve&, const QPromiseReject& reject) { + QtPromisePrivate::qtpromise_defer([=]() { + reject(QString("foo")); + }); + }); + + QCOMPARE(p0.isPending(), true); + QCOMPARE(waitForError(p0, QString()), QString("foo")); + + p0 = QPromise([](const QPromiseResolve& resolve) { + QtPromisePrivate::qtpromise_defer([=]() { + resolve(43); + }); + }); + + QCOMPARE(p0.isPending(), true); + QCOMPARE(waitForValue(p0, -1), 43); +} + +void tst_qpromise_operators::move_void() +{ + auto p0 = QPromise::resolve(); + + QCOMPARE(p0.isFulfilled(), true); + QCOMPARE(waitForValue(p0, -1, 42), 42); + + p0 = QPromise([](const QPromiseResolve&, const QPromiseReject& reject) { + QtPromisePrivate::qtpromise_defer([=]() { + reject(QString("foo")); + }); + }); + + QCOMPARE(p0.isPending(), true); + QCOMPARE(waitForError(p0, QString()), QString("foo")); + + p0 = QPromise([](const QPromiseResolve& resolve) { + QtPromisePrivate::qtpromise_defer([=]() { + resolve(); + }); + }); + + QCOMPARE(p0.isPending(), true); + QCOMPARE(waitForValue(p0, -1, 43), 43); +} + +void tst_qpromise_operators::copy() +{ + auto p0 = QPromise([](const QPromiseResolve&, const QPromiseReject& reject) { + QtPromisePrivate::qtpromise_defer([=]() { + reject(QString("foo")); + }); + }); + + auto p1 = QPromise([](const QPromiseResolve& resolve) { + QtPromisePrivate::qtpromise_defer([=]() { + resolve(42); + }); + }); + + QCOMPARE(p0 == p1, false); + QCOMPARE(p0.isPending(), true); + QCOMPARE(p1.isPending(), true); + + p0 = p1; + + QCOMPARE(p0 == p1, true); + QCOMPARE(p0.isPending(), true); + QCOMPARE(p1.isPending(), true); + QCOMPARE(waitForValue(p0, -1), 42); + QCOMPARE(waitForValue(p1, -1), 42); +} + +void tst_qpromise_operators::copy_void() +{ + auto p0 = QPromise([](const QPromiseResolve&, const QPromiseReject& reject) { + QtPromisePrivate::qtpromise_defer([=]() { + reject(QString("foo")); + }); + }); + + auto p1 = QPromise([](const QPromiseResolve& resolve) { + QtPromisePrivate::qtpromise_defer([=]() { + resolve(); + }); + }); + + QCOMPARE(p0 == p1, false); + QCOMPARE(p0.isPending(), true); + QCOMPARE(p1.isPending(), true); + + p0 = p1; + + QCOMPARE(p0 == p1, true); + QCOMPARE(p0.isPending(), true); + QCOMPARE(p1.isPending(), true); + + p0.wait(); + + QCOMPARE(p0.isFulfilled(), true); + QCOMPARE(p1.isFulfilled(), true); +} + +void tst_qpromise_operators::equalTo() +{ + auto p0 = QPromise::resolve(42); + auto p1 = QPromise::resolve(42); + auto p2 = p1; + auto p3(p2); + + QCOMPARE(p0 == p1, false); + QCOMPARE(p0 == p2, false); + QCOMPARE(p0 == p3, false); + QCOMPARE(p1 == p2, true); + QCOMPARE(p1 == p3, true); + QCOMPARE(p2 == p3, true); +} + +void tst_qpromise_operators::equalTo_void() +{ + auto p0 = QPromise::resolve(); + auto p1 = QPromise::resolve(); + auto p2 = p1; + auto p3(p2); + + QCOMPARE(p0 == p1, false); + QCOMPARE(p0 == p2, false); + QCOMPARE(p0 == p3, false); + QCOMPARE(p1 == p2, true); + QCOMPARE(p1 == p3, true); + QCOMPARE(p2 == p3, true); +} + +void tst_qpromise_operators::notEqualTo() +{ + auto p0 = QPromise::resolve(42); + auto p1 = QPromise::resolve(42); + auto p2 = p1; + auto p3(p2); + + QCOMPARE(p0 != p1, true); + QCOMPARE(p0 != p2, true); + QCOMPARE(p0 != p3, true); + QCOMPARE(p1 != p2, false); + QCOMPARE(p1 != p3, false); + QCOMPARE(p2 != p3, false); +} + +void tst_qpromise_operators::notEqualTo_void() +{ + auto p0 = QPromise::resolve(); + auto p1 = QPromise::resolve(); + auto p2 = p1; + auto p3(p2); + + QCOMPARE(p0 != p1, true); + QCOMPARE(p0 != p2, true); + QCOMPARE(p0 != p3, true); + QCOMPARE(p1 != p2, false); + QCOMPARE(p1 != p3, false); + QCOMPARE(p2 != p3, false); +} + +void tst_qpromise_operators::chaining() +{ + auto p = QPromise::resolve(1); + for (int i=0; i<4; ++i) { + p = p.then([](int res) { + return QPromise::resolve(res * 2); + }); + } + + QCOMPARE(p.isPending(), true); + QCOMPARE(waitForValue(p, -1), 16); +} + +void tst_qpromise_operators::chaining_void() +{ + QVector values; + + auto p = QPromise::resolve(); + + for (int i=0; i<4; ++i) { + p = p.then([i, &values]() { + values.append(i * 2); + return QPromise::resolve(); + }); + } + + QCOMPARE(p.isPending(), true); + QCOMPARE(waitForValue(p, -1, 42), 42); + QCOMPARE(values, QVector({0, 2, 4, 6})); +} diff --git a/tests/auto/qtpromise/qpromise/qpromise.pro b/tests/auto/qtpromise/qpromise/qpromise.pro index 7eb2f1f..e166df4 100644 --- a/tests/auto/qtpromise/qpromise/qpromise.pro +++ b/tests/auto/qtpromise/qpromise/qpromise.pro @@ -4,6 +4,7 @@ SUBDIRS += \ delay \ fail \ finally \ + operators \ tap \ then \ timeout