summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/kernel/qobject/tst_qobject.cpp')
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp100
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()
{
{