diff options
Diffstat (limited to 'tests/auto/corelib/kernel/qobject/tst_qobject.cpp')
-rw-r--r-- | tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index c6fb1025ac..4776bdbbc9 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -103,6 +103,7 @@ private slots: void recursiveSignalEmission(); #endif void signalBlocking(); + void signalBlockingMoveAssignment(); void blockingQueuedConnection(); void childEvents(); void installEventFilter(); @@ -3030,6 +3031,105 @@ void tst_QObject::signalBlocking() receiver.reset(); } +void tst_QObject::signalBlockingMoveAssignment() +{ +#ifdef Q_COMPILER_RVALUE_REFS + QObject o1, o2; + + // move-assignment: both block other objects + { + QSignalBlocker b(&o1); + QVERIFY(o1.signalsBlocked()); + + QVERIFY(!o2.signalsBlocked()); + b = QSignalBlocker(&o2); + QVERIFY(!o1.signalsBlocked()); + QVERIFY(o2.signalsBlocked()); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + + // move-assignment: from inert other + { + QSignalBlocker b(&o1); + QVERIFY(o1.signalsBlocked()); + b = QSignalBlocker(0); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + + // move-assignment: to inert *this + { + QSignalBlocker b(0); + QVERIFY(!o1.signalsBlocked()); + { + QSignalBlocker inner(&o1); + QVERIFY(o1.signalsBlocked()); + b = std::move(inner); + } + QVERIFY(o1.signalsBlocked()); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + + // move-assignment: both block the same object, neither is unblocked + { + QSignalBlocker b(&o1); + QVERIFY(o1.signalsBlocked()); + { + b.unblock(); // make sure inner.m_blocked = false + QVERIFY(!o1.signalsBlocked()); + QSignalBlocker inner(&o1); + QVERIFY(o1.signalsBlocked()); + b.reblock(); + QVERIFY(o1.signalsBlocked()); + b = std::move(inner); + } + QVERIFY(o1.signalsBlocked()); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + + // move-assignment: both block the same object, but *this is unblocked + { + QSignalBlocker b(&o1); + QVERIFY(o1.signalsBlocked()); + b.unblock(); + QVERIFY(!o1.signalsBlocked()); + b = QSignalBlocker(&o1); + QVERIFY(o1.signalsBlocked()); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + + // move-assignment: both block the same object, but other is unblocked + { + QSignalBlocker b(&o1); + { + QVERIFY(o1.signalsBlocked()); + QSignalBlocker inner(&o1); + QVERIFY(o1.signalsBlocked()); + inner.unblock(); + QVERIFY(o1.signalsBlocked()); + b = std::move(inner); + QVERIFY(!o1.signalsBlocked()); + } + QVERIFY(!o1.signalsBlocked()); + } + + QVERIFY(!o1.signalsBlocked()); + QVERIFY(!o2.signalsBlocked()); + +#else + QSKIP("This compiler is not in C++11 mode or doesn't support move semantics"); +#endif // Q_COMPILER_RVALUE_REFS +} + void tst_QObject::blockingQueuedConnection() { { |