summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2012-01-12 21:53:56 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-24 01:13:01 +0100
commitc0323cfbaf198afe15f8eec60d5e0323be91f0d5 (patch)
tree31be4c31056408a064da96c19496a85d1f10264a /tests
parentd584292aa2e17dbb7cdfee24b442cd9cb66e5aac (diff)
Test connecting to virtual function pointer
The C++ standard says that the comparison between pointer to virtual function is unspecified (C++11 $5.10.2) But we still may rely on it for the Qt::UniqueConnection and the disconnection So test if it works while using the same function. Using function from different classes works for me, but we should probably not assume it works. I left it commented in the test for reference. Change-Id: I1d9b91d4cc1a424d4f43ef2ee4981b8573f1e86f Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index 15353a3764..9628bb3faa 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -134,6 +134,7 @@ private slots:
void returnValue();
void returnValue2_data();
void returnValue2();
+ void connectVirtualSlots();
};
class SenderObject : public QObject
@@ -5150,6 +5151,52 @@ void tst_QObject::returnValue2()
}
}
+class VirtualSlotsObjectBase : public QObject {
+ Q_OBJECT
+public slots:
+ virtual void slot1() {
+ base_counter1++;
+ }
+public:
+ VirtualSlotsObjectBase() : base_counter1(0) {}
+ int base_counter1;
+signals:
+ void signal1();
+};
+
+class VirtualSlotsObject : public VirtualSlotsObjectBase {
+ Q_OBJECT
+public slots:
+ virtual void slot1() {
+ derived_counter1++;
+ }
+public:
+ VirtualSlotsObject() : derived_counter1(0) {}
+ int derived_counter1;
+};
+
+void tst_QObject::connectVirtualSlots()
+{
+ VirtualSlotsObject obj;
+ QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
+ QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
+
+ emit obj.signal1();
+ QCOMPARE(obj.base_counter1, 0);
+ QCOMPARE(obj.derived_counter1, 1);
+
+ QVERIFY(QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1));
+ QVERIFY(!QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1));
+
+ emit obj.signal1();
+ QCOMPARE(obj.base_counter1, 0);
+ QCOMPARE(obj.derived_counter1, 1);
+
+ /* the C++ standard say the comparison between pointer to virtual member function is unspecified
+ QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
+ QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObject::slot1, Qt::UniqueConnection));
+ */
+}
QTEST_MAIN(tst_QObject)
#include "tst_qobject.moc"